pthread_cond_broadcast is not asynch signal safe
authorNikodemus Siivola <nikodemus@random-state.net>
Mon, 7 Nov 2011 12:49:57 +0000 (14:49 +0200)
committerNikodemus Siivola <nikodemus@random-state.net>
Thu, 17 Nov 2011 16:30:45 +0000 (18:30 +0200)
commitd67355bbb5c570cac6fe866113d79ce9de9b51a7
treebaedc478b56ec4cb7ba636b802815303e7df5a4d
parent023121d25355efa1ac14e14f4b787de9346bdc4a
pthread_cond_broadcast is not asynch signal safe

  AKA /less/ GC deadlocks on Darwin.

  To be specific, it can cause our GC to deadlock on Darwin, with all lisp
  threads spinning on the same global spinlock in the bowels of the
  pthread_cond_wait implementation. That was fun to figure out.

  The test (:interrupt-thread :interrupt-consing-child) is a good one
  for catching this: try to run it repeatedly under an earlier SBCL
  under Darwin, and sooner or later it will hang.

  ...with this commit, we're still using pthread_cond_broadcast, but
  blocking signals around the relevant bits, which --experimentally--
  makes the aforementioned test pass "somewhat more consistently".

  It can still hang, but those hangs seem to be related to deferrable
  signals being indefinitely blocked in one of the threads -- no idea
  as of yet why.

  Summa Summarum: this is a bit of a sorry bandaid, waiting for
  a better solution. (Probably using realtime semaphores, which
  /should/ be signal-handler safe.)
src/runtime/thread.h