[ruby-core:62722] Re: [ruby-trunk - Bug #9835] IGNORE signal handler has possible race condition in Ruby 2.1.2

From: Eric Wong <normalperson@...>
Date: 2014-05-24 05:48:56 UTC
List: ruby-core #62722
nobu@ruby-lang.org wrote:
> As signal is asynchronous, it is not guaranteed essentially?

The problem is a race with the way we defer signal handling

Kyle expected two states for USR1:
1) print children: sighandler, trap_list[sig].cmd === proc
2) ignore: SIG_IGN, trap_list[sig].cmd == 0

However, the problem is we queued a SIGUSR1 at 1),
but queue and handle the signal after 2) passes

So the queued signal hits cmd==0, leading to rb_threadptr_signal_raise
and SignalException.  Signals queued after 2) are safe from this
condition.

> Anyway, the patch doesn't seem evil.

OK, I'll wait a bit for Kyle to confirm.  However, I just managed to
reproduce the issue by limiting to one CPU on one of my machines:

	schedtool -a 0x1 -e ruby test.rb

My proposed patch seems to fix it on my machine.

In This Thread

Prev Next