From: "ko1 (Koichi Sasada)" <redmine@...>
Date: 2012-09-22T07:10:26+09:00
Subject: [ruby-dev:46153] [ruby-trunk - Bug #4911] timer_thread_function() が thead unsafe


Issue #4911 has been updated by ko1 (Koichi Sasada).


問題はわかったのですが,
これがどうして解決するのかわかりません.
(結局,+  if (!vm->running_thread->yielding) の部分で running_thread を触っているように見える)

解説してもらえないでしょうか.

----

では,どうやって解決するかというと難しいですね.タイマスレッドが動いている間は free しない,とか,そういうのになりそうな感じ.



----------------------------------------
Bug #4911: timer_thread_function() が thead unsafe
https://bugs.ruby-lang.org/issues/4911#change-29647

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/