Hi, all. I’m studying concurrency and I think, I don’t understand dupChan or even worse, the channels itself. Could you point me what is wrong in my observations?
I’ve drew several pics to understand how channels build and how they work and if you see mistakes, could you point me to it, please?
//////////////////////////////
creating channel
//////////////////////////////
newChan :: IO (Chan a)
newChan = do
hole <- newEmptyMVar -- MVar (ChItem Int)
read <- newMVar hole -- MVar (MVar (ChItem Int))
write <- newMVar hole -- MVar (MVar (ChItem Int))
return $ Chan read write
main :: IO ()
main = newChan >> return ()
//////////////////////////////////
writing to a channel
//////////////////////////////////
writeChan :: Chan a -> a -> IO ()
writeChan (Chan _ w) v = do
newHole <- newEmptyMVar
oldHole <- takeMVar w
putMVar w newHole
putMVar oldHole (ChItem v newHole)
main :: IO ()
main = do
ch <- newChan
writeChan ch 2 >> return ()
main :: IO ()
main = do
ch <- newChan
writeChan ch 2
writeChan ch 8 >> return ()
////////////////////////////////////////
reading from a channel
////////////////////////////////////////
readChan :: Chan a -> IO a
readChan (Chan r _) = do
hole <- takeMVar r
takeMVar hole >>= \(ChItem v next) -> putMVar r next >> return v
main :: IO ()
main = do
ch <- newChan
writeChan ch 2
writeChan ch 8
readChan ch >>= print -- 2
//////////////////////////////////////////////////////////
and now, my headache - dupChan
//////////////////////////////////////////////////////////
dupChan :: Chan a -> IO (Chan a)
dupChan (Chan _ w) = do
hole <- readMVar w
newRead <- newMVar hole
return $ Chan newRead w
main :: IO ()
main = do
ch <- newChan
writeChan ch 2
writeChan ch 8
readChan ch >>= print -- 2
dupChan ch >> return ()
However, here I totally don’t understand what’s going on, if I want to read data from the dupChan I can’t, it seems that there is block happened
main :: IO ()
main = do
x <- newChan
writeChan x 8
y <- dupChan2 x
readChan y >>= print -- blocked, even it has value in read stream
What’s wrong with my picture of dupChan? Sorry for English, if so