quiet spurious wakeups for accept() in Thread* models
commit31ee6b4daa1da9cd02e75b27924b2729345e999d
authorEric Wong <normalperson@yhbt.net>
Tue, 29 Dec 2009 20:59:01 +0000 (29 12:59 -0800)
committerEric Wong <normalperson@yhbt.net>
Tue, 29 Dec 2009 20:59:01 +0000 (29 12:59 -0800)
treec00cc159a7e330763ae72f307dab3664d0f3d5b9
parentd5375f5c24abfae0173007f47bc9e83139d556b5
quiet spurious wakeups for accept() in Thread* models

Under all MRI 1.8, a blocking Socket#accept Ruby method (needs
to[1]) translate to a non-blocking accept(2) system call that may
wake up threads/processes unnecessarily.  Unfortunately, we
failed to trap and ignore EAGAIN in those cases.

This issue did not affect Ruby 1.9 running under modern Linux
kernels where a _blocking_ accept(2) system call is not (easily,
at least) susceptible to spurious wakeups.  Non-Linux systems
running Ruby 1.9 may be affected.

[1] - using a blocking accept(2) on a shared socket with
      green threads is dangerous, as noted in
      commit ee7fe220ccbc991e1e7cbe982caf48e3303274c7
      (and commit 451ca6997b4f298b436605b7f0af75f369320425)
lib/rainbows.rb
lib/rainbows/thread_pool.rb
lib/rainbows/thread_spawn.rb
t/t0012-spurious-wakeups-quiet.sh [new file with mode: 0755]