summaryrefslogtreecommitdiff
path: root/src/compiler/GF/System
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2015-09-11 14:18:01 +0000
committerhallgren <hallgren@chalmers.se>2015-09-11 14:18:01 +0000
commit9556cf453f6c1499a2907acd72d7b11211387b0d (patch)
treecb3ccf15669ba2766b7607e286bf008df016f5b5 /src/compiler/GF/System
parentef888baec84264bd94284fec13c7a076dcb8a84c (diff)
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.
Diffstat (limited to 'src/compiler/GF/System')
-rw-r--r--src/compiler/GF/System/Concurrency.hs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/compiler/GF/System/Concurrency.hs b/src/compiler/GF/System/Concurrency.hs
new file mode 100644
index 000000000..38e6559fc
--- /dev/null
+++ b/src/compiler/GF/System/Concurrency.hs
@@ -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