isEmptySampleVar returns False when threads are waiting on an empty SampleVar
The source code for Control.Concurrent.SampleVar.isEmptySampleVar:
isEmptySampleVar :: SampleVar a -> IO Bool
isEmptySampleVar (SampleVar svar) = do
(readers, _) <- readMVar svar
return (readers == 0)
should have readers <= 0, as the state readers < 0 is used to indicate the SampleVar is empty and has threads waiting on it.
As an example:
import System.Random
import Control.Concurrent.SampleVar
import Control.Concurrent
do_something = threadDelay 100000 -- 100 ms
loop body = body >> loop body
produce, consume :: SampleVar Int -> IO ()
produce svar = do
do_something
b <- isEmptySampleVar svar
if b then randomIO >>= writeSampleVar svar else return ()
consume svar = readSampleVar svar >>= print
main = do
svar <- newEmptySampleVar
forkIO $ loop $ produce svar
forkIO $ loop $ consume svar
threadDelay 1000000 -- one second
This code deadlocks instead of printing random numbers.
Trac metadata
Trac field | Value |
---|---|
Version | 7.0.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | eric.stansifer+haskell@gmail.com |
Operating system | |
Architecture |