Proposal: replace readMVar with atomicReadMVar, breaking BC

Edward Z. Yang ezyang at MIT.EDU
Wed Jul 10 19:08:17 CEST 2013


I only realized that the ordering semantics were different when I
was writing this email.  I'll go add them to the Haddock docs.

Excerpts from Simon Peyton-Jones's message of Wed Jul 10 03:47:27 -0700 2013:
> Good!  Are the new semantics clearly documented?
> 
> Simon
> 
> | -----Original Message-----
> | From: libraries-bounces at haskell.org [mailto:libraries-
> | bounces at haskell.org] On Behalf Of Edward Z. Yang
> | Sent: 10 July 2013 10:20
> | To: libraries
> | Subject: Proposal: replace readMVar with atomicReadMVar, breaking BC
> | 
> | GHC HEAD recently got a new primitive: atomicReadMVar#, which allows you
> | to read MVars without first taking and then putting back (removing a
> | nasty race where readMVar only works properly when there are no waiting
> | putters).
> | 
> | atomicReadMVar behaves differently from readMVar.  The key
> | differences are:
> | 
> |     - An atomicReadMVar op never causes an MVar to become "empty" at any
> | point.
> |       This means less programs deadlock now.
> | 
> |     - An blocked atomicReadMVar is always served by the *first* putMVar
> |       to arrive (it cuts to the head of the queue), whereas readMVar
> |       obeyed the FIFO ordering.  This means this program behaves
> | differently:
> | 
> |         m <- newEmptyMVar
> |         forkIO $ takeMVar m
> |         threadDelay 100
> |         forkIO $ print =<< readMVar m {- atomicReadMVar m -}
> |         threadDelay 100
> |         putMVar m 1
> |         putMVar m 2
> |         -- readMVar: outputs 2
> |         -- atomicReadMVar: outputs 1
> | 
> |       It actually would not be too difficult to add support for
> | atomicReadMVar
> |       which *does* respect the FIFO ordering but I don't have a sense
> | when
> |       that would be useful.
> | 
> | The general feeling Simon and I have is that everyone really wanted
> | to make believe readMVar was atomicReadMVar, and so maybe we should
> | break BC and make readMVar do the right thing.  But it is probably
> | worth some discussion, and I entreat you to think about the second
> | point more carefully.
> | 
> | Thanks,
> | Edward
> | 
> | _______________________________________________
> | Libraries mailing list
> | Libraries at haskell.org
> | http://www.haskell.org/mailman/listinfo/libraries



More information about the Libraries mailing list