[#37679] [FEATURE:trunk] EncDet again — "Yugui (Yuki Sonoda)" <yugui@...>

Yuguiです。

23 messages 2009/01/03

[#37748] $LOAD_PATHとバージョンの運用の関係 — akira yamada / やまだあきら <akira@...>

1.9系でのバージョンの運用と$LOAD_PATHの値について質問です。

12 messages 2009/01/09
[#37758] Re: $LOAD_PATHとバージョンの運用の関係 — "NARUSE, Yui" <naruse@...> 2009/01/11

成瀬です。

[ruby-dev:37676] [Bug #968] trap may fail to handle signals

From: Yusuke Endoh <redmine@...>
Date: 2009-01-02 08:09:47 UTC
List: ruby-dev #37676
Bug #968: trap may fail to handle signals
http://redmine.ruby-lang.org/issues/show/968

起票者: Yusuke Endoh
ステータス: Open, 優先度: Normal
担当者: Koichi Sasada, カテゴリ: YARV, Target version: 1.9.1 RC2

遠藤です。

シグナルが連続して送られたとき、シグナルを読み落とすことが
あるようです。具体的には、以下のプログラムが停止しません。

./ruby -e '
n = 0
trap(:USR1) { n += 1 }
30.times { Process.kill(:USR1, $$) }
until n == 30
  1000**100000 # wait
  p n
end
'

これは仕様でしょうか。
仕様でなければ、以下のようなパッチでどうでしょうか。

Index: thread.c
===================================================================
--- thread.c	(revision 21269)
+++ thread.c	(working copy)
@@ -1145,6 +1145,10 @@
 void
 rb_thread_execute_interrupts(rb_thread_t *th)
 {
+    if (GET_VM()->main_thread == th) {
+	while (rb_signal_buff_size() && !th->exec_signal) native_thread_yield();
+    }
+
     if (th->raised_flag) return;
 
     while (th->interrupt_flag) {
@@ -2438,13 +2442,14 @@
 {
     rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */
     int sig;
+    rb_thread_t *mth;
 
     /* for time slice */
     RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
 
     /* check signal */
-    if ((sig = rb_get_next_signal()) > 0) {
-	rb_thread_t *mth = vm->main_thread;
+    mth = vm->main_thread;
+    if (!mth->exec_signal && (sig = rb_get_next_signal()) > 0) {
 	enum rb_thread_status prev_status = mth->status;
 	thread_debug("main_thread: %s, sig: %d\n",
 		     thread_status_name(prev_status), sig);

-- 
Yusuke ENDOH <mame@tsg.ne.jp>


----------------------------------------
http://redmine.ruby-lang.org

In This Thread

Prev Next