Why does c_sleep return immediately in the following code?
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types
import Data.Time.Clock
import Control.Concurrent
foreign import ccall unsafe "unistd.h sleep"
c_sleep :: CUInt -> IO CUInt
main :: IO ()
main = do
getCurrentTime >>= print . utctDayTime
c_sleep 10 >>= print -- this doesn't sleep
getCurrentTime >>= print . utctDayTime
threadDelay $ 10 * 1000 * 1000 -- this does sleep
getCurrentTime >>= print . utctDayTime
$ ghc --make Sleep.hs && ./Sleep [1 of 1] Compiling Main ( Sleep.hs, Sleep.o ) Linking Sleep ... 29448.191603s 10 29448.20158s 29458.211402s $ ghc --version The Glorious Glasgow Haskell Compilation System, version 7.8.3 $ cabal --version cabal-install version 1.20.0.3 using version 1.20.0.0 of the Cabal library
Note: Actually, I would like to use sleep in C code to simulate some heavy computation in a function func and call that function in Haskell, but that doesn't work either, probably for the same reasons.
sleep. Have you checked the error code? Perhaps you should wrap it in a loop to restart it if it gets interrupted (in which case it's best to usenanosleepfor higher precision). - Rufflewindsleepdoesn't return an error code, but the unslept amount in seconds :/. Haven't triednanosleepyet, butusleepdoesn't work either. - Zetaerrnovariable. Wrap(c_sleep 10)insidethrowErrnoIf (/= 0) "sleep"and you'll see that it's being interrupted. - Rufflewindsleepcall. - Rufflewindman 3 sleepmention theerrnoupdate? I guess I'll have too write avoid nanosleep_loop(uint32_t), sincenanosleepgets affected too. The ticket probably answers this question, so feel free to add one. - Zeta