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 usenanosleep
for higher precision). – Rufflewindsleep
doesn't return an error code, but the unslept amount in seconds :/. Haven't triednanosleep
yet, butusleep
doesn't work either. – Zetaerrno
variable. Wrap(c_sleep 10)
insidethrowErrnoIf (/= 0) "sleep"
and you'll see that it's being interrupted. – Rufflewindsleep
call. – Rufflewindman 3 sleep
mention theerrno
update? I guess I'll have too write avoid nanosleep_loop(uint32_t)
, sincenanosleep
gets affected too. The ticket probably answers this question, so feel free to add one. – Zeta