[project @ 2005-03-02 13:11:00 by simonmar]
authorsimonmar <unknown>
Wed, 2 Mar 2005 13:11:00 +0000 (13:11 +0000)
committersimonmar <unknown>
Wed, 2 Mar 2005 13:11:00 +0000 (13:11 +0000)
We should not assume that the timeout parameter to select() is updated
with the time left over after select() returns.  Linux does this, but
FreeBSD does not.

Fixes -threaded hangs on FreeBSD.

GHC/Conc.lhs

index 6b258de..8476498 100644 (file)
@@ -573,24 +573,26 @@ service_loop wakeup readfds writefds ptimeval old_reqs old_delays = do
   fdSet wakeup readfds
   maxfd <- buildFdSets 0 readfds writefds reqs
 
-  -- check the current time and wake up any thread in threadDelay whose
-  -- timeout has expired.  Also find the timeout value for the select() call.
-  now <- getTicksOfDay
-  (delays', timeout) <- getDelay now ptimeval delays
-
   -- perform the select()
-  let do_select = do
+  let do_select delays = do
+         -- check the current time and wake up any thread in
+         -- threadDelay whose timeout has expired.  Also find the
+         -- timeout value for the select() call.
+         now <- getTicksOfDay
+         (delays', timeout) <- getDelay now ptimeval delays
+
          res <- c_select ((max wakeup maxfd)+1) readfds writefds 
                        nullPtr timeout
          if (res == -1)
             then do
                err <- getErrno
                if err == eINTR
-                       then do_select
-                       else return res
+                       then do_select delays'
+                       else return (res,delays')
             else
-               return res
-  res <- do_select
+               return (res,delays')
+
+  (res,delays') <- do_select delays
   -- ToDo: check result
 
   b <- takeMVar prodding