aris
1
Issue #6911 has been reported by mrkn (Kenta M.).
Bug #6911: Sync_m#sync_unlock で ThreadError が発生する場合がある
Author: mrkn (Kenta M.)
Status: Open
Priority: Normal
Assignee:
Category: lib
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0]
Sync_m#sync_unlock で ThreadError が発生する場合があります。
原因は Sync_m#sync_lock が同一スレッドを複数回 sync_waiting 配列に push してしまうからです。
同一スレッドが多重に sync_waiting 配列に入っていると、sync_unlock の中で何度もそのスレッドに対して
Thread#run が呼ばれます。
すると、1回目の Thread#run でそのスレッドが終了した場合、2回目の Thread#run で ThreadError が発生します。
sync_waiting に同一スレッドが複数回 push された状態を再現するコードを gist に置きました。
この gist に添付されてる test を実行すると、以下のような結果が得られると思います。
[1/1] SyncTest#test_synchronize = 0.51 s
- Failure:
test_synchronize(SyncTest)
[/Users/kenta-murata/work/ruby.git/test/test_sync.rb:57]:
<[#<Thread:0x007f904183aa08 sleep>,
#<Thread:0x007f904183ab98 sleep>,
#<Thread:0x007f904183af58 sleep>]> expected but was
<[#<Thread:0x007f904183aa08 sleep>,
#<Thread:0x007f904183ab98 sleep>,
#<Thread:0x007f904183af58 sleep>,
#<Thread:0x007f904183aa08 sleep>]>.
修正用のパッチも上記 gist に添付してあります。修正方法がこの通りで良ければコミットしたいので、どなたかレビューをお願いします。
Issue #6911 has been updated by kosaki (Motohiro KOSAKI).
Status changed from Open to Closed
調査した結果 5355と同じだと分かったのであっちのパッチいれます。ごめんね
Bug #6911: Sync_m#sync_unlock で ThreadError が発生する場合がある
Author: mrkn (Kenta M.)
Status: Closed
Priority: Normal
Assignee:
Category: lib
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0]
Sync_m#sync_unlock で ThreadError が発生する場合があります。
原因は Sync_m#sync_lock が同一スレッドを複数回 sync_waiting 配列に push してしまうからです。
同一スレッドが多重に sync_waiting 配列に入っていると、sync_unlock の中で何度もそのスレッドに対して
Thread#run が呼ばれます。
すると、1回目の Thread#run でそのスレッドが終了した場合、2回目の Thread#run で ThreadError が発生します。
sync_waiting に同一スレッドが複数回 push された状態を再現するコードを gist に置きました。
この gist に添付されてる test を実行すると、以下のような結果が得られると思います。
[1/1] SyncTest#test_synchronize = 0.51 s
- Failure:
test_synchronize(SyncTest)
[/Users/kenta-murata/work/ruby.git/test/test_sync.rb:57]:
<[#<Thread:0x007f904183aa08 sleep>,
#<Thread:0x007f904183ab98 sleep>,
#<Thread:0x007f904183af58 sleep>]> expected but was
<[#<Thread:0x007f904183aa08 sleep>,
#<Thread:0x007f904183ab98 sleep>,
#<Thread:0x007f904183af58 sleep>,
#<Thread:0x007f904183aa08 sleep>]>.
修正用のパッチも上記 gist に添付してあります。修正方法がこの通りで良ければコミットしたいので、どなたかレビューをお願いします。
Issue #6911 has been updated by kosaki (Motohiro KOSAKI).
余談なんですけど、なんで Mutex.sleep を thread.run で起こせる仕様なんでしたっけ? Thread.stop,
Thread.sleep 以外は起こせないほうが普通の感覚かと思うのですが。
とはいえ、スレッドライブラリはTimeout
moduleとかでexeptionが突然飛んできても大丈夫なように書いてあるべきなので、この制限をいれてもSync_mを直さないといけないという結論は変わらないのですが
Bug #6911: Sync_m#sync_unlock で ThreadError が発生する場合がある
Author: mrkn (Kenta M.)
Status: Closed
Priority: Normal
Assignee:
Category: lib
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0]
Sync_m#sync_unlock で ThreadError が発生する場合があります。
原因は Sync_m#sync_lock が同一スレッドを複数回 sync_waiting 配列に push してしまうからです。
同一スレッドが多重に sync_waiting 配列に入っていると、sync_unlock の中で何度もそのスレッドに対して
Thread#run が呼ばれます。
すると、1回目の Thread#run でそのスレッドが終了した場合、2回目の Thread#run で ThreadError が発生します。
sync_waiting に同一スレッドが複数回 push された状態を再現するコードを gist に置きました。
この gist に添付されてる test を実行すると、以下のような結果が得られると思います。
[1/1] SyncTest#test_synchronize = 0.51 s
- Failure:
test_synchronize(SyncTest)
[/Users/kenta-murata/work/ruby.git/test/test_sync.rb:57]:
<[#<Thread:0x007f904183aa08 sleep>,
#<Thread:0x007f904183ab98 sleep>,
#<Thread:0x007f904183af58 sleep>]> expected but was
<[#<Thread:0x007f904183aa08 sleep>,
#<Thread:0x007f904183ab98 sleep>,
#<Thread:0x007f904183af58 sleep>,
#<Thread:0x007f904183aa08 sleep>]>.
修正用のパッチも上記 gist に添付してあります。修正方法がこの通りで良ければコミットしたいので、どなたかレビューをお願いします。