X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FConcurrent.hs;h=02f74fb89195f9793eaf135f837bac71181459cc;hb=fc8eec6049cab18cf63e8f6d940e49ad3ffd27d6;hp=f2991339b7a1c720561ee58c2ffee243dd9d80e4;hpb=740432bcb906959a6742ddde36946f6737e9447a;p=haskell-directory.git diff --git a/Control/Concurrent.hs b/Control/Concurrent.hs index f299133..02f74fb 100644 --- a/Control/Concurrent.hs +++ b/Control/Concurrent.hs @@ -91,7 +91,8 @@ import Prelude import Control.Exception as Exception #ifdef __GLASGOW_HASKELL__ -import GHC.Conc +import GHC.Conc ( ThreadId(..), myThreadId, killThread, yield, + threadDelay, threadWaitRead, threadWaitWrite ) import GHC.TopHandler ( reportStackOverflow, reportError ) import GHC.IOBase ( IO(..) ) import GHC.IOBase ( unsafeInterleaveIO ) @@ -143,7 +144,7 @@ In GHC, threads may also communicate via exceptions. Scheduling may be either pre-emptive or co-operative, depending on the implementation of Concurrent Haskell (see below - for imformation related to specific compilers). In a co-operative + for information related to specific compilers). In a co-operative system, context switches only occur when you use one of the primitives defined in this module. This means that programs such as: @@ -314,12 +315,8 @@ nmergeIO lss {- $boundthreads Support for multiple operating system threads and bound threads as described -below is currently only available in the GHC runtime system when the runtime system -has been compiled using a special option. - -When recompiling GHC, use .\/configure --enable-threaded-rts to enable this. -To find your GHC has already been compiled that way, use -'rtsSupportsBoundThreads' from GHCi. +below is currently only available in the GHC runtime system if you use the +/-threaded/ option when linking. Other Haskell systems do not currently support multiple operating system threads. @@ -382,6 +379,9 @@ forkOS_entry stableAction = do foreign import ccall forkOS_createThread :: StablePtr (IO ()) -> IO CInt +failNonThreaded = fail $ "RTS doesn't support multiple OS threads " + ++"(use ghc -threaded when linking)" + forkOS action | rtsSupportsBoundThreads = do mv <- newEmptyMVar @@ -392,7 +392,7 @@ forkOS action tid <- takeMVar mv freeStablePtr entry return tid - | otherwise = fail "RTS not built to support multiple OS threads." + | otherwise = failNonThreaded -- | Returns 'True' if the calling thread is /bound/, that is, if it is -- safe to use foreign libraries that rely on thread-local state from the @@ -429,7 +429,7 @@ runInBoundThread action case resultOrException of Left exception -> Exception.throw exception Right result -> return result - | otherwise = fail "RTS not built to support multiple OS threads." + | otherwise = failNonThreaded {- | Run the 'IO' computation passed as the first argument. If the calling thread @@ -527,7 +527,7 @@ runInUnboundThread action = do a thread may be pre-empted whenever it allocates some memory, which unfortunately means that tight loops which do no allocation tend to lock out other threads (this only seems to - happen with pathalogical benchmark-style code, however). + happen with pathological benchmark-style code, however). The rescheduling timer runs on a 20ms granularity by default, but this may be altered using the