On 23/10/10 23:17, Donn Cave wrote:
Quoth Claude Heiland-Allen<claudiusmaxi...@goto10.org>,
...
The conclusion I drew was that "unsafe" foreign functions block the
current "capability" (OS thread) and any "threads" (Haskell forkIO etc)
currently scheduled on that capability, but other capabilities and
threads continue executing as normal.

... until GC time when all capabilities must be ready. (?)

If a trivial test program would help, here I call the sleep() function,
which I believe on a POSIX platform suspends the thread until receipt
of a SIGALRM.

I wrote a program which shows some interesting behaviour:

----8<----

{-# LANGUAGE ForeignFunctionInterface #-}
module Main (main) where
import GHC.Conc (forkOnIO, numCapabilities)
import Control.Concurrent (threadDelay)
import Foreign.C (CInt)
import System.Environment (getArgs)

foreign import ccall unsafe "sleep" sleep :: CInt -> IO CInt

delayer :: Int -> IO ()
delayer n = do
  print ("delayer", n)
  threadDelay 100000 -- 10Hz
  delayer n

sleeper :: Int -> IO ()
sleeper n = do
  print ("sleeper", n)
  _ <- sleep 1       --  1Hz
  sleeper n

main :: IO ()
main = do
  m <- (read . head) `fmap` getArgs
  mapM_ (\n -> forkOnIO n $ delayer n) [1 .. numCapabilities]
  mapM_ (\n -> forkOnIO n $ sleeper n) [1 .. numCapabilities - m]
  threadDelay 100000000 -- 100s

----8<----

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.3
$ uname -a
Linux zebimus 2.6.32-25-generic #44-Ubuntu SMP Fri Sep 17 20:05:27 UTC 2010 x86_64 GNU/Linux
$ ghc -O2 -Wall -threaded --make DelayedSleep.hs
$ ./DelayedSleep +RTS -N4 -S -RTS 3
[snip]

----8<----

By interesting I mean there is lots of output from the delayer threads on capabilities without sleeper threads (as you would expect), with the delayer threads on capabilities also having sleeper threads being much less frequent (as you might also expect). But then there are some long pauses where there is no output from any thread: my hypothesis is that the whole runtime is blocked waiting for all threads to be ready for GC (because +RTS -S shows some GC stats after the end of those pauses).


Claude
--
http://claudiusmaximus.goto10.org
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to