Bug #4770

[Q] thread->interrupt_flag が適切に排他制御されていないように見える

Added by Motohiro KOSAKI almost 3 years ago. Updated almost 3 years ago.

[ruby-dev:43467]
Status:Closed
Priority:Normal
Assignee:Motohiro KOSAKI
Category:core
Target version:1.9.3
ruby -v:- Backport:

Description

kosakiです

Ruby VM internal
に詳しい方々に質問です。現在、thread->interrupt_flagはどうやって排他制御されるデザインになっていますでしょうか?

といいますのは

1.ビットマスクとして使っているので排他制御しないとフラグがロストしてえらい事になりそう

#define RUBYVMSETINTERRUPT(th) ((th)->interruptflag |= 0x02)
#define RUBYVMSETTIMERINTERRUPT(th) ((th)->interruptflag |= 0x01)
#define RUBY
VMSETFINALIZERINTERRUPT(th) ((th)->interruptflag |= 0x04)
#define RUBYVMINTERRUPTED(th) ((th)->interrupt_flag & 0x02)

2.割り込み処理でフラグをリセットする箇所ではGVLしかとってない

static void
rbthreadptrexecuteinterruptsrec(rbthreadt *th, int sched_depth)
{
(snip)

 while (th->interrupt_flag) {
     enum rb_thread_status status = th->status;
     int timer_interrupt = th->interrupt_flag & 0x01;
     int finalizer_interrupt = th->interrupt_flag & 0x04;
     th->interrupt_flag = 0;

3.タイマースレッドはTIMERINTERRUPT bitを立てる時に、timerthread_lock しか取ってない

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

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

4.thread.c では RUBYVMSETINTERRUPT呼ぶときに thread->interruptlock 取るが
cont.c では取らない

5.gc.cも RUBYVMSETFINALIZERINTERRUPT 呼ぶときに特にロックを取らない

という、なかなか整合性がとれていなさそうな状況になっていそうだからです。なにか見落としていますでしょうか?

# 一瞬、すべて interruptlockで守るのがいいのかな。と思ったのですがよく考えたら nativemutex_lock()関数が
# thread.c 以外からは呼べないのでした。

0001-interrupt-flag.patch Magnifier (7.53 KB) Motohiro KOSAKI, 05/23/2011 09:46 AM

History

#1 Updated by Motohiro KOSAKI almost 3 years ago

  • File 0001-interrupt-flag.patchMagnifier added
  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to Motohiro KOSAKI
  • Target version set to 1.9.3

#2 Updated by Motohiro KOSAKI almost 3 years ago

  • Status changed from Assigned to Closed

Also available in: Atom PDF