ruby-dev (Japanese) list archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない
@ 2011-12-13  7:35 Yui NARUSE
  2011-12-13 17:34 ` [ruby-dev:44987] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
                   ` (8 more replies)
  0 siblings, 9 replies; 12+ messages in thread
From: Yui NARUSE @ 2011-12-13  7:35 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been reported by Yui NARUSE.

----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
http://redmine.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0dev (2011-12-12 trunk 34015) [x86_64-freebsd9.0]


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:44987] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
@ 2011-12-13 17:34 ` Motohiro KOSAKI
  2011-12-14  0:45 ` [ruby-dev:44992] " Tomoyuki Chikanaga
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Motohiro KOSAKI @ 2011-12-13 17:34 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Motohiro KOSAKI.


[Bug #5343] (r33307) でのregressionですね(193ブランチだと r33310)。単純にそこを削除すると Bug #5343が復活してしまうので、タイマー貼る必要があるんじゃないですかね。タイマースレッドを起こすためのタイマーって泥縄感が半端ないけど。
----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
http://redmine.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0dev (2011-12-12 trunk 34015) [x86_64-freebsd9.0]


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:44992] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
  2011-12-13 17:34 ` [ruby-dev:44987] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
@ 2011-12-14  0:45 ` Tomoyuki Chikanaga
  2011-12-14  1:36   ` [ruby-dev:44993] " KOSAKI Motohiro
  2011-12-14  6:00 ` [ruby-dev:44995] " Yui NARUSE
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 12+ messages in thread
From: Tomoyuki Chikanaga @ 2011-12-14  0:45 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Tomoyuki Chikanaga.


Bug #5343 を登録したものです。
ちゃんと試さずに書いてしまいますが、 #5343 は別の Thread からの kill や raise での割り込みの場合の問題だったと記憶していますので、ubf_select() での rb_thread_wakeup_timer_thread() の呼び出しはタイマースレッドで実行する場合は呼ばないようにすることで両方大丈夫にならないでしょうか。

diff --git a/thread_pthread.c b/thread_pthread.c
index afef326..16f7674 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -924,6 +924,8 @@ native_sleep(rb_thread_t *th, struct timeval *timeout_tv)
     thread_debug("native_sleep done\n");
 }

+static pthread_t timer_thread_id;
+
 #ifdef USE_SIGNAL_THREAD_LIST
 struct signal_thread_list {
     rb_thread_t *th;
@@ -1018,7 +1020,8 @@ ubf_select(void *ptr)
 {
     rb_thread_t *th = (rb_thread_t *)ptr;
     add_signal_thread_list(th);
-    rb_thread_wakeup_timer_thread(); /* activate timer thread */
+    if ( pthread_self() != timer_thread_id )
+       rb_thread_wakeup_timer_thread(); /* activate timer thread */
     ubf_select_each(th);
 }

@@ -1047,7 +1050,6 @@ ping_signal_thread_list(void) {
 static int ping_signal_thread_list(void) { return 0; }
 #endif /* USE_SIGNAL_THREAD_LIST */

-static pthread_t timer_thread_id;
 static int timer_thread_pipe[2] = {-1, -1};
 static int timer_thread_pipe_owner_process;


----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
http://redmine.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0dev (2011-12-12 trunk 34015) [x86_64-freebsd9.0]


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [ruby-dev:44993] Re: [ruby-trunk - Bug #5757] main  threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-14  0:45 ` [ruby-dev:44992] " Tomoyuki Chikanaga
@ 2011-12-14  1:36   ` KOSAKI Motohiro
  0 siblings, 0 replies; 12+ messages in thread
From: KOSAKI Motohiro @ 2011-12-14  1:36 UTC (permalink / raw
  To: ruby developers list

2011年12月13日19:45 Tomoyuki Chikanaga <nagachika00@gmail•com>:
>
> Issue #5757 has been updated by Tomoyuki Chikanaga.
>
>
> Bug #5343 を登録したものです。
> ちゃんと試さずに書いてしまいますが、 #5343 は別の Thread からの kill や raise での割り込みの場合の問題だったと記憶していますので、ubf_select() での rb_thread_wakeup_timer_thread() の呼び出しはタイマースレッドで実行する場合は呼ばないようにすることで両方大丈夫にならないでしょうか。

いや、スレッドがGVL競合してなくて、ubf_selectを登録したけどまだselectを読んでないとき
ubf_selectのkill(VTALRM) はスカるので、もう一回ubf_select_eachが呼ばれるようにする
トリックが必要だという認識です。

もうコードがうろ覚えなのでなにか見落としてる可能性もありますが。

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:44995] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
  2011-12-13 17:34 ` [ruby-dev:44987] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
  2011-12-14  0:45 ` [ruby-dev:44992] " Tomoyuki Chikanaga
@ 2011-12-14  6:00 ` Yui NARUSE
  2011-12-14  6:04   ` [ruby-dev:44996] " SASADA Koichi
  2011-12-14 12:45 ` [ruby-dev:44999] " Tomoyuki Chikanaga
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 12+ messages in thread
From: Yui NARUSE @ 2011-12-14  6:00 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Yui NARUSE.

ruby -v changed from - to ruby 2.0.0dev (2011-12-12 trunk 34015) [x86_64-freebsd9.0]

レビューありがとうございます。

> いや、スレッドがGVL競合してなくて、ubf_selectを登録したけどまだselectを読んでないとき
> ubf_selectのkill(VTALRM) はスカるので、もう一回ubf_select_eachが呼ばれるようにする
> トリックが必要だという認識です。

そのもう一回も外しちゃう可能性って無いんでしょうか。
どちらかというと、rb_thread_kill 側で確実に止めを刺す用にするべきな気もします。


rb_thread_kill で rb_thread_wakeup_timer_thread() というのも考えていたんですが、
とりあえず [ruby-dev:44992] で動いてるっぽかったので、各プラットフォームでの確認の利便性を鑑み、
r34038 にてコミットしてます。
----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
http://redmine.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0dev (2011-12-12 trunk 34015) [x86_64-freebsd9.0]


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:44996] Re: [ruby-dev:44995] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-14  6:00 ` [ruby-dev:44995] " Yui NARUSE
@ 2011-12-14  6:04   ` SASADA Koichi
  0 siblings, 0 replies; 12+ messages in thread
From: SASADA Koichi @ 2011-12-14  6:04 UTC (permalink / raw
  To: ruby developers list

(2011/12/14 15:00), Yui NARUSE wrote:
> そのもう一回も外しちゃう可能性って無いんでしょうか。
> どちらかというと、rb_thread_kill 側で確実に止めを刺す用にするべきな気もします。

 もう一回外す可能性があるため,必要が無くなるまで何度もやります.

-- 
// SASADA Koichi at atdot dot net

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:44999] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
                   ` (2 preceding siblings ...)
  2011-12-14  6:00 ` [ruby-dev:44995] " Yui NARUSE
@ 2011-12-14 12:45 ` Tomoyuki Chikanaga
  2011-12-21  9:41 ` [ruby-dev:45019] [ruby-trunk - Bug #5757][Open] " Tomoyuki Chikanaga
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Tomoyuki Chikanaga @ 2011-12-14 12:45 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Tomoyuki Chikanaga.

File bug5757.patch added

Motohiro KOSAKI wrote:
> いや、スレッドがGVL競合してなくて、ubf_selectを登録したけどまだselectを読んでないとき
> ubf_selectのkill(VTALRM) はスカるので、もう一回ubf_select_eachが呼ばれるようにする
> トリックが必要だという認識です。
少しゆっくり考えてみましたところ、ubf_select() を呼ぶのがタイマースレッドでなければこれまで通り rb_thread_wakeup_timer_thread() を呼ぶので、 signal_thread_list に入れたものをタイマースレッドが確実に blocking region を抜けるまで面倒をみてくれる(定期的にSIGVTALRM送信)ので安泰です。
しかしタイマースレッドがシグナルを処理させるために rb_threadptr_check_signal() からメインスレッドに割り込みする時の ubf_select() で rb_thread_wakeup_timer_thread() を呼ばなくなるため、シグナル受信処理時に SIGVTALRM の喪失してメインスレッドが止まったままになる可能性があるのではないかと思います。

thread_timer() の ping_signal_thread_list() で signal_thread_list をチェックした(そして空だった)後に timer_thread_function() で新たに signal_thread_list にメインスレッドが追加された場合が問題なわけなので、この後に signal_thread_list のチェックを入れればいいのではないかと思います。というわけで追加のパッチを添付します。

----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
http://redmine.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: -


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:45019] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
                   ` (3 preceding siblings ...)
  2011-12-14 12:45 ` [ruby-dev:44999] " Tomoyuki Chikanaga
@ 2011-12-21  9:41 ` Tomoyuki Chikanaga
  2011-12-21 14:26 ` [ruby-dev:45020] [ruby-trunk - Bug #5757][Assigned] " Motohiro KOSAKI
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Tomoyuki Chikanaga @ 2011-12-21  9:41 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Tomoyuki Chikanaga.

Status changed from Closed to Open

[ruby-dev:44999] に書いたように今度はシグナル処理の漏れの懸念があるので再 open させて頂きます。
----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
https://bugs.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: -


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:45020] [ruby-trunk - Bug #5757][Assigned] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
                   ` (4 preceding siblings ...)
  2011-12-21  9:41 ` [ruby-dev:45019] [ruby-trunk - Bug #5757][Open] " Tomoyuki Chikanaga
@ 2011-12-21 14:26 ` Motohiro KOSAKI
  2011-12-21 16:35 ` [ruby-dev:45023] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Motohiro KOSAKI @ 2011-12-21 14:26 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Motohiro KOSAKI.

Status changed from Open to Assigned
Assignee set to Motohiro KOSAKI

すいません。なるべく早く時間取ってレビューします
----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
https://bugs.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Motohiro KOSAKI
Category: 
Target version: 
ruby -v: -


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:45023] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
                   ` (5 preceding siblings ...)
  2011-12-21 14:26 ` [ruby-dev:45020] [ruby-trunk - Bug #5757][Assigned] " Motohiro KOSAKI
@ 2011-12-21 16:35 ` Motohiro KOSAKI
  2011-12-22 13:47 ` [ruby-dev:45031] " Tomoyuki Chikanaga
  2011-12-22 13:47 ` [ruby-dev:45032] [ruby-trunk - Bug #5757][Closed] " Tomoyuki Chikanaga
  8 siblings, 0 replies; 12+ messages in thread
From: Motohiro KOSAKI @ 2011-12-21 16:35 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Motohiro KOSAKI.

Assignee changed from Motohiro KOSAKI to Tomoyuki Chikanaga

しばらく考えた結果、[ruby-dev:44999] のパッチで問題ないという結論に至りました。コミットお願い出来ますでしょうか

----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
https://bugs.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Tomoyuki Chikanaga
Category: 
Target version: 
ruby -v: -


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:45031] [ruby-trunk - Bug #5757] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
                   ` (6 preceding siblings ...)
  2011-12-21 16:35 ` [ruby-dev:45023] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
@ 2011-12-22 13:47 ` Tomoyuki Chikanaga
  2011-12-22 13:47 ` [ruby-dev:45032] [ruby-trunk - Bug #5757][Closed] " Tomoyuki Chikanaga
  8 siblings, 0 replies; 12+ messages in thread
From: Tomoyuki Chikanaga @ 2011-12-22 13:47 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Tomoyuki Chikanaga.


確認ありがとうございます。 r34099 でコミットしました。
----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
https://bugs.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Tomoyuki Chikanaga
Category: 
Target version: 
ruby -v: -


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [ruby-dev:45032] [ruby-trunk - Bug #5757][Closed] main threadがreadやselectで待っていると、^C でなかなか死なない
  2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
                   ` (7 preceding siblings ...)
  2011-12-22 13:47 ` [ruby-dev:45031] " Tomoyuki Chikanaga
@ 2011-12-22 13:47 ` Tomoyuki Chikanaga
  8 siblings, 0 replies; 12+ messages in thread
From: Tomoyuki Chikanaga @ 2011-12-22 13:47 UTC (permalink / raw
  To: ruby developers list


Issue #5757 has been updated by Tomoyuki Chikanaga.

Status changed from Assigned to Closed


----------------------------------------
Bug #5757: main threadがreadやselectで待っていると、^C でなかなか死なない
https://bugs.ruby-lang.org/issues/5757

Author: Yui NARUSE
Status: Closed
Priority: Normal
Assignee: Tomoyuki Chikanaga
Category: 
Target version: 
ruby -v: -


FreeBSD 9 にて、 ./ruby と起動して ^C を投げてもなかなか死にません。
./miniruby でも -e'$stdin.read' でも同じです。

仕組みとしては、main thread が read や select で待つ場合、最近は blocking region で
unblock.func に ubf_select を設定するわけですが、この時にシグナルが来ると、
1. どこかのスレッドの sighandler が呼ばれて、rb_thread_wakeup_timer_thread() が呼ばれる
2. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
3. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
4. タイマースレッドが起きて、thread_timer() -> timer_thread_function() -> rb_threadptr_check_signal() -> rb_threadptr_interrupt() -> (th->unblock.func)(th->unblock.arg) -> ubf_select() -> rb_thread_wakeup_timer_thread() が呼ばれる
...

対策はいくつかあり得ると思うのですが、例えば、ubf_select() から rb_thread_wakeup_timer_thread() を呼ばないようにするとか


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

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2011-12-22 14:02 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-13  7:35 [ruby-dev:44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない Yui NARUSE
2011-12-13 17:34 ` [ruby-dev:44987] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
2011-12-14  0:45 ` [ruby-dev:44992] " Tomoyuki Chikanaga
2011-12-14  1:36   ` [ruby-dev:44993] " KOSAKI Motohiro
2011-12-14  6:00 ` [ruby-dev:44995] " Yui NARUSE
2011-12-14  6:04   ` [ruby-dev:44996] " SASADA Koichi
2011-12-14 12:45 ` [ruby-dev:44999] " Tomoyuki Chikanaga
2011-12-21  9:41 ` [ruby-dev:45019] [ruby-trunk - Bug #5757][Open] " Tomoyuki Chikanaga
2011-12-21 14:26 ` [ruby-dev:45020] [ruby-trunk - Bug #5757][Assigned] " Motohiro KOSAKI
2011-12-21 16:35 ` [ruby-dev:45023] [ruby-trunk - Bug #5757] " Motohiro KOSAKI
2011-12-22 13:47 ` [ruby-dev:45031] " Tomoyuki Chikanaga
2011-12-22 13:47 ` [ruby-dev:45032] [ruby-trunk - Bug #5757][Closed] " Tomoyuki Chikanaga

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).