Repository : ssh://darcs.haskell.org//srv/darcs/packages/unix

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/ba7961f118f42ba9db7e5fba017270a257852ff3

>---------------------------------------------------------------

commit ba7961f118f42ba9db7e5fba017270a257852ff3
Author: Paolo Capriotti <[email protected]>
Date:   Mon Jul 2 11:52:39 2012 +0100

    Add a WARNING for sleep, and expand documentation.
    
    sleep doesn't really work on GHC because it is always immediately
    interrupted by SIGVTALRM used in the RTS.
    
    I explained the problem in a comment and added a WARNING pragma.
    
    usleep and nanosleep have a similar problem, but, since they have better
    precision, they can be restarted, so they are not as unusable as sleep.

>---------------------------------------------------------------

 System/Posix/Unistd.hsc |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/System/Posix/Unistd.hsc b/System/Posix/Unistd.hsc
index 7312dae..dfd2673 100644
--- a/System/Posix/Unistd.hsc
+++ b/System/Posix/Unistd.hsc
@@ -95,18 +95,28 @@ foreign import ccall unsafe "uname"
 -- | Sleep for the specified duration (in seconds).  Returns the time remaining
 -- (if the sleep was interrupted by a signal, for example).
 --
--- GHC Note: the comment for 'usleep' also applies here.
+-- /GHC Note/: 'Control.Concurrent.threadDelay' is a better choice.  Since GHC
+-- uses signals for its internal clock, a call to 'sleep' will usually be
+-- interrupted immediately.  That makes 'sleep' unusable in a program compiled
+-- with GHC, unless the RTS timer is disabled (with @+RTS -V0@).  Furthermore,
+-- without the @-threaded@ option, 'sleep' will block all other user threads.
+-- Even with the @-threaded@ option, 'sleep' requires a full OS thread to
+-- itself.  'Control.Concurrent.threadDelay' has none of these shortcomings.
 --
 sleep :: Int -> IO Int
 sleep 0 = return 0
 sleep secs = do r <- c_sleep (fromIntegral secs); return (fromIntegral r)
 
+#ifdef __GLASGOW_HASKELL__
+{-# WARNING sleep "This function has several shortcomings (see documentation). 
Please consider using Control.Concurrent.threadDelay instead." #-}
+#endif
+
 foreign import ccall safe "sleep"
   c_sleep :: CUInt -> IO CUInt
 
 -- | Sleep for the specified duration (in microseconds).
 --
--- GHC Note: 'Control.Concurrent.threadDelay' is a better choice.
+-- /GHC Note/: 'Control.Concurrent.threadDelay' is a better choice.
 -- Without the @-threaded@ option, 'usleep' will block all other user
 -- threads.  Even with the @-threaded@ option, 'usleep' requires a
 -- full OS thread to itself.  'Control.Concurrent.threadDelay' has
@@ -134,6 +144,7 @@ foreign import ccall safe "usleep"
 
 -- | Sleep for the specified duration (in nanoseconds)
 --
+-- /GHC Note/: the comment for 'usleep' also applies here.
 nanosleep :: Integer -> IO ()
 #ifndef HAVE_NANOSLEEP
 nanosleep = error "nanosleep: not available on this platform"



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to