Hi,

At Mon, 15 Dec 2003 22:00:51 +0900,
Yukihiro Matsumoto wrote:
> |Y> I thought context switch would not happen during restore_context,
> |Y> because rb_trap_immediate is turned off.  Am I wrong?
> |
> | ruby has a new thread thread_timer() where it can call nanosleep() when
> | rb_thread_critical is set and it has catch_timer()
> 
> Sorry for being stupid, but rb_trap_immediate is turned off in the
> restore_context, so thread_timer only set rb_thread_pending to 1 at
> most during the function execution, thus context switch would not
> happen even when tb_thread_critical is not set, right?

Isn't there a possibility that main pthread enters a critical
section, while the timer thread is sending the signal and
before it arrives to the main?


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.605 diff -u -2 -p -d -w -r1.605 eval.c --- eval.c 13 Dec 2003 09:13:39 -0000 1.605 +++ eval.c 15 Dec 2003 14:03:28 -0000 @@ -9499,7 +9499,5 @@ static int thread_init = 0; #endif -#if defined(PTHREAD_TIMER) -static pthread_t time_thread; - +#if defined(PTHREAD_TIMER) || defined(HAVE_SETITIMER) static void catch_timer(sig) @@ -9509,6 +9507,14 @@ catch_timer(sig) signal(sig, catch_timer); #endif + if (!rb_thread_critical) { + if (rb_trap_immediate) { rb_thread_schedule(); + } + else rb_thread_pending = 1; + } } + +#ifdef PTHREAD_TIMER +static pthread_t time_thread; static void* @@ -9519,15 +9525,8 @@ thread_timer(dummy) for (;;) { - if (!rb_thread_critical) { - if (rb_trap_immediate) { pthread_kill(ruby_thid, SIGVTALRM); - } - else { - rb_thread_pending = 1; - } req.tv_sec = 0; req.tv_nsec = 10000000; nanosleep(&req, &rem); - } } } @@ -9542,21 +9541,5 @@ rb_thread_stop_timer() { } -#elif defined(HAVE_SETITIMER) - -static void -catch_timer(sig) - int sig; -{ -#if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL) - signal(sig, catch_timer); -#endif - if (!rb_thread_critical) { - if (rb_trap_immediate) { - rb_thread_schedule(); - } - else rb_thread_pending = 1; - } -} - +#else /* HAVE_SETITIMER */ void rb_thread_start_timer() @@ -9582,5 +9565,6 @@ rb_thread_stop_timer() setitimer(ITIMER_VIRTUAL, &tval, NULL); } -#else +#endif +#else /* !(PTHREAD_TIMER || HAVE_SETITIMER) */ int rb_thread_tick = THREAD_TICK; #endif
-- Nobu Nakada