Re: mask, catch, myThreadId, throwTo

2013-04-16 Thread Edward Z. Yang
OK, I've updated the docus.

Excerpts from Felipe Almeida Lessa's message of Mon Apr 15 13:34:50 -0700 2013:
 Thanks a lot, you're correct!  The trouble is, I was misguided by the
 Interruptible operations note [1] which states that
 
 The following operations are guaranteed not to be interruptible:
 ... * everything from Control.Exception ...
 
 Well, it seems that not everything from Control.Exception fits the bill.
 
 Thanks, =)
 
 [1] 
 http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html#g:14
 
 On Mon, Apr 15, 2013 at 5:25 PM, Bertram Felgenhauer
 bertram.felgenha...@googlemail.com wrote:
  Felipe Almeida Lessa wrote:
  I have some code that is not behaving the way I thought it should.
 
  The gist of it is
 
sleeper =
  mask_ $
  forkIOWithUnmask $ \restore -
forever $
  restore sleep `catch` throwBack
 
throwBack (Ping tid) = myThreadId = throwTo tid . Pong
throwBack (Pong tid) = myThreadId = throwTo tid . Ping
 
  Since (a) throwBack is executed on a masked state, (b) myThreadId is
  uninterruptible, and (c) throwTo is uninterruptible, my understanding
  is that the sleeper thread should catch all PingPong exceptions and
  never let any one of them through.
 
  (c) is wrong, throwTo may block, and blocking operations are interruptible.
 

  http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html#v:throwTo
 
  explains this in some more detail.
 
  The simplest way that throwTo can actually block in your program, as
  far as I can see, and one that will only affect the threaded RTS, is
  if the sleeper thread and whichever thread is running the other
  throwBack are executing on different capabilities; this will always
  cause throwTo to block. (You could try looking at a ghc event log to
  find out more.)
 
  I last ran into trouble like that with System.Timeout.timeout; for
  that function I finally convinced myself that uninterruptibleMask
  is the only way to avoid such problems; then throwTo will not be
  interrupted by exceptions even when it blocks. Maybe this is the
  solution for your problem, too.
 
  Hope that helps,
 
  Bertram
 
 
  ___
  Glasgow-haskell-users mailing list
  Glasgow-haskell-users@haskell.org
  http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
 

___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


Re: mask, catch, myThreadId, throwTo

2013-04-16 Thread Felipe Almeida Lessa
Nice, thanks, Edward =).

On Tue, Apr 16, 2013 at 6:20 PM, Edward Z. Yang ezy...@mit.edu wrote:
 OK, I've updated the docus.

 Excerpts from Felipe Almeida Lessa's message of Mon Apr 15 13:34:50 -0700 
 2013:
 Thanks a lot, you're correct!  The trouble is, I was misguided by the
 Interruptible operations note [1] which states that

 The following operations are guaranteed not to be interruptible:
 ... * everything from Control.Exception ...

 Well, it seems that not everything from Control.Exception fits the bill.

 Thanks, =)

 [1] 
 http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html#g:14

 On Mon, Apr 15, 2013 at 5:25 PM, Bertram Felgenhauer
 bertram.felgenha...@googlemail.com wrote:
  Felipe Almeida Lessa wrote:
  I have some code that is not behaving the way I thought it should.
 
  The gist of it is
 
sleeper =
  mask_ $
  forkIOWithUnmask $ \restore -
forever $
  restore sleep `catch` throwBack
 
throwBack (Ping tid) = myThreadId = throwTo tid . Pong
throwBack (Pong tid) = myThreadId = throwTo tid . Ping
 
  Since (a) throwBack is executed on a masked state, (b) myThreadId is
  uninterruptible, and (c) throwTo is uninterruptible, my understanding
  is that the sleeper thread should catch all PingPong exceptions and
  never let any one of them through.
 
  (c) is wrong, throwTo may block, and blocking operations are interruptible.
 

  http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html#v:throwTo
 
  explains this in some more detail.
 
  The simplest way that throwTo can actually block in your program, as
  far as I can see, and one that will only affect the threaded RTS, is
  if the sleeper thread and whichever thread is running the other
  throwBack are executing on different capabilities; this will always
  cause throwTo to block. (You could try looking at a ghc event log to
  find out more.)
 
  I last ran into trouble like that with System.Timeout.timeout; for
  that function I finally convinced myself that uninterruptibleMask
  is the only way to avoid such problems; then throwTo will not be
  interrupted by exceptions even when it blocks. Maybe this is the
  solution for your problem, too.
 
  Hope that helps,
 
  Bertram
 
 
  ___
  Glasgow-haskell-users mailing list
  Glasgow-haskell-users@haskell.org
  http://www.haskell.org/mailman/listinfo/glasgow-haskell-users




-- 
Felipe.

___
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users