mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 19:22:50 -06:00
Parallel compilation: "gf -make -j" and "gf -make -j=n" now work as expected
* "gf -make -j=n" uses n parallel threads. * "gf -make -j" adapts to the number of processors in the system. This mimics how "cabal build -j" and "ghc --make -j" works. Support for this is implemented in the new module GF.System.Concurrency and it depends on the function Control.Concurrent.setNumCapabilities, which is only available in GHC>=7.6 (base>=4.6). GF can still be compiled with GHC<7.6, but then you have to use +RTS -N -RTS to take advantage of multicore processors. To detect the number of processors in the system, the code depends on a foreign import of a C function in the GHC run-time system.
This commit is contained in:
33
src/compiler/GF/System/Concurrency.hs
Normal file
33
src/compiler/GF/System/Concurrency.hs
Normal file
@@ -0,0 +1,33 @@
|
||||
{-# LANGUAGE CPP,ForeignFunctionInterface #-}
|
||||
-- | A variant of 'Control.Concurrent.setNumCapabilities' that automatically
|
||||
-- detects the number of processors in the system, and is available
|
||||
-- even when compiling with GHC<7.6.
|
||||
module GF.System.Concurrency(
|
||||
-- * Controlling parallelism
|
||||
setNumCapabilities,getNumberOfProcessors) where
|
||||
import qualified Control.Concurrent as C
|
||||
import Foreign.C.Types(CInt(..))
|
||||
|
||||
|
||||
|
||||
|
||||
-- | Set parallelism to a given number, or use the number of processors.
|
||||
-- Returns 'False' if compiled with GHC<7.6 and the desired number of threads
|
||||
-- hasn't already been set with @+RTS -N/n/ -RTS@.
|
||||
setNumCapabilities opt_n =
|
||||
do n <- maybe getNumberOfProcessors return opt_n
|
||||
#if MIN_VERSION_base(4,6,0)
|
||||
C.setNumCapabilities n
|
||||
return True
|
||||
#else
|
||||
n_now <- C.getNumCapabilities
|
||||
print (n,n_now)
|
||||
return (n==n_now)
|
||||
#endif
|
||||
|
||||
-- | Returns the number of processors in the system.
|
||||
getNumberOfProcessors = fmap fromEnum c_getNumberOfProcessors
|
||||
|
||||
-- | According to comments in cabal-install cbits/getnumprocessors.c
|
||||
-- this function is part of the RTS of GHC>=6.12.
|
||||
foreign import ccall "getNumberOfProcessors" c_getNumberOfProcessors :: IO CInt
|
||||
Reference in New Issue
Block a user