[ruby-dev:46157] [ruby-trunk - Bug #4911] timer_thread_function() が thead unsafe

From: "kosaki (Motohiro KOSAKI)" <kosaki.motohiro@...>
Date: 2012-09-22 00:44:01 UTC
List: ruby-dev #46157
Issue #4911 has been updated by kosaki (Motohiro KOSAKI).


で、Comment#4のパッチだと残念なことにタイマースレッドとスレッド解放ルートに共通のロックがないため、グローバル変数に代入してもメモリバリア的な意味でthread_free() からは可視にならなさそう
----------------------------------------
Bug #4911: timer_thread_function() が thead unsafe
https://bugs.ruby-lang.org/issues/4911#change-29661

Author: kosaki (Motohiro KOSAKI)
Status: Assigned
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0
ruby -v: trunk


どうして、これを先月気づかなかったのだろう。という罪悪感があるのですが、
target 1.9.x で起票します。

timer_thread_function()で vm->running_thread にアクセスするのは
thread unsafe な気がします

0.スレッドAがrunning_threadである
1.タイマースレッドがvm->running_threadをレジスタにのせる
    (レジスタにスレッドAのアドレスがのっかる)
2.コンテキストスイッチ
3.スレッドAが終了。スレッドBがrunning_threadになる
4.スレッドAの rb_thead_t がfreeされる
5.コンテキストスイッチ
6.そんなkとはつゆしらず、タイマースレッドはスレッドAの
    アドレスに対して th->interrupt_flag |= 1; するのでメモリ破壊

----------------------------------------------------------
static void
timer_thread_function(void *arg)
{
    rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */

    /* for time slice */
    RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);      ※ここ

    /* check signal */
    rb_threadptr_check_signal(vm->main_thread);
}


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

In This Thread