@@ -149,7 +149,7 @@ data SVarStyle = SVarStyle SVarTag SVarSched deriving Eq
150data SVar m a =
150data SVar m a =
151 SVar { outputQueue :: IORef [ChildEvent a]
151 SVar { outputQueue :: IORef [ChildEvent a]
152− , doorBell :: MVar Bool -- wakeup mechanism for outQ
152+ , doorBell :: MVar () -- wakeup mechanism for outQ
153 , enqueue :: Stream m a -> IO ()
153 , enqueue :: Stream m a -> IO ()
154 , runqueue :: m ()
154 , runqueue :: m ()
155 , runningThreads :: IORef (Set ThreadId)
155 , runningThreads :: IORef (Set ThreadId)
@@ -311,7 +311,7 @@ send sv msg = liftIO $ do
311 if null old
311 if null old
312 -- XXX need a memory barrier? The wake up must happen only after the
312 -- XXX need a memory barrier? The wake up must happen only after the
313 -- store has finished otherwise we can have lost wakeup problems.
313 -- store has finished otherwise we can have lost wakeup problems.
314− then void $ tryPutMVar (doorBell sv) True
314+ then void $ tryPutMVar (doorBell sv) ()
315 else return ()
315 else return ()
317{-# INLINE sendStop #-}
317{-# INLINE sendStop #-}
@@ -405,7 +405,7 @@ modifyThread sv tid = do
405 then let new = (S.delete tid old) in (new, new)
405 then let new = (S.delete tid old) in (new, new)
406 else let new = (S.insert tid old) in (new, old)
406 else let new = (S.insert tid old) in (new, old)
407 if null changed
407 if null changed
408− then liftIO $ void $ tryPutMVar (doorBell sv) True
408+ then liftIO $ void $ tryPutMVar (doorBell sv) ()
409 else return ()
409 else return ()
411-- | This is safe even if we are adding more threads concurrently because if
411-- | This is safe even if we are adding more threads concurrently because if
@@ -456,7 +456,7 @@ sendWorkerWait sv = do
456 done <- queueEmpty sv
456 done <- queueEmpty sv
457 if not done
457 if not done
458 then pushWorker sv >> sendWorkerWait sv
458 then pushWorker sv >> sendWorkerWait sv
459− else void (liftIO $ takeMVar (doorBell sv))
459+ else liftIO $ takeMVar (doorBell sv)
461-- | Pull a stream from an SVar.
461-- | Pull a stream from an SVar.
462{-# NOINLINE fromStreamVar #-}
462{-# NOINLINE fromStreamVar #-}
@@ -464,7 +464,7 @@ fromStreamVar :: MonadParallel m => SVar m a -> Stream m a
464fromStreamVar sv = Stream $ \_ stp sng yld -> do
464fromStreamVar sv = Stream $ \_ stp sng yld -> do
465 let SVarStyle _ sched = svarStyle sv
465 let SVarStyle _ sched = svarStyle sv
466 if sched == Par
466 if sched == Par
467− then void $ liftIO $ takeMVar (doorBell sv)
467+ then liftIO $ takeMVar (doorBell sv)
469 res <- liftIO $ tryTakeMVar (doorBell sv)
469 res <- liftIO $ tryTakeMVar (doorBell sv)
470 when (isNothing res) $ sendWorkerWait sv
470 when (isNothing res) $ sendWorkerWait sv