Project

General

Profile

Actions

Bug #6911

closed

Sync_m#sync_unlock で ThreadError が発生する場合がある

Added by mrkn (Kenta Murata) over 11 years ago. Updated over 11 years ago.

Status:
Closed
Assignee:
-
Target version:
ruby -v:
ruby 2.0.0dev (2012-08-23 trunk 36795) [x86_64-darwin11.4.0]
Backport:
[ruby-dev:46074]

Description

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 に置きました。
https://gist.github.com/3434046

この gist に添付されてる test を実行すると、以下のような結果が得られると思います。

[1/1] SyncTest#test_synchronize = 0.51 s

  1. 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 に添付してあります。修正方法がこの通りで良ければコミットしたいので、どなたかレビューをお願いします。


Related issues 1 (0 open1 closed)

Is duplicate of Ruby master - Bug #5355: Sync_mにBug #5195やBug #5258と同様のバグClosedkosaki (Motohiro KOSAKI)09/23/2011Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0