
On Wed, Feb 17, 2010 at 3:27 PM, Felipe Lessa
In acquire (l. 111), if the lock was already acquired it goes by
| otherwise → do putMVar mv mb Lock.acquire lock
So it puts back the information about the owner of the RLock and waits for its release in the normal Lock. And then... nothing? Shouldn't it need to put into mv information about itself?
Well spotted! In order to fix this we changed the structure of an RLock a bit. The inner lock isn't contained in a Maybe anymore but directly in the MVar. So now there is only 1 Lock associated with an RLock. This makes reasoning about the control flow a bit simpler. We also added a test case which fails on the original code but succeeds with the new version.
In release (l. 142) Nothing is put into mv
then do Lock.release lock putMVar mv Nothing
I'm not sure if that was a bug in the original. In the new version we put the lock back inside the MVar. Current version: http://hackage.haskell.org/package/concurrent-extra-0.1.0.1 Thanks, Roel