mask in waitQSem

Simon Marlow marlowsd at
Tue Nov 25 13:53:56 UTC 2014

On 24/11/2014 11:12, Yuras Shumovich wrote:
> On Mon, 2014-11-24 at 10:09 +0000, Simon Marlow wrote:
>> On 14/11/2014 21:23, Yuras Shumovich wrote:
>>> I was reviewing some exception handling code in base library, and I
>>> found this line:
>>> Here mask is used, but I looks completely useless for me. waitQSem
>>> itself should be called with async exceptions masked, otherwise there is
>>> no way to prevent resource leak.
>>> Do anyone know why mask is used here?
>> I wrote that code.  It looks like mask_ is important, otherwise an async
>> exception might leave the MVar empty, no?  We can't assume that waitQSem
>> is always called inside a mask_, so it does its own mask_.
> Hmm, yes, you are right.
> Note, that in case of failure (and without external `mask`) it is not
> possible to determine, whether a unit of resource was reserved or not.
> It makes the particular instance of `QSem` unusable anymore, and we have
> to create other one. Probably there are situations where it is OK
> though.

I don't think that's true: if waitQSem fails, then the semaphore has not 
been acquired.  This guarantee is important for "bracket waitQSem 
signalSQem" to work.  I just peered at the code again and I believe this 
is true - have you spotted a case where it might be false?  If so that's 
a bug.


> Thanks,
> Yuras
>> Cheers,
>> Simon
>>> I wonder whether an author of the code tried to do something different,
>>> so there actually can be a bug hidden here. Probably
>>> uninterruptibleMask_ should be used here? (I don't think so though.)
>>> Thanks,
>>> Yuras
>>> _______________________________________________
>>> ghc-devs mailing list
>>> ghc-devs at

More information about the ghc-devs mailing list