>>>>> "Y" == Yukihiro Matsumoto <matz / ruby-lang.org> writes:

Y> Sorry for being stupid, but rb_trap_immediate is turned off in the
Y> restore_context, so thread_timer only set rb_thread_pending to 1 at
Y> most during the function execution, thus context switch would not
Y> happen even when tb_thread_critical is not set, right?

 here the case (svg can have the problem very quickly)

(gdb) r c.rb
Starting program: /home/ts/ruby/ruby-1.8.1/ruby c.rb
[New Thread 16384 (LWP 8248)]
[New Thread 32769 (LWP 8249)]
[New Thread 16386 (LWP 8250)]
- 1- 1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16||||||- 17- 17-
17- 17- 17- 17- 17- 18- 19- 20- 21- 22- 24- 24- 25- 26- 27- 28- 29- 30- 31-
32- 33- 35- 35- 36- 37- 38- 39- 40- 41- 42- 43- 44||||||- 45- 45- 45- 45-
45- 46- 46- 46- 47|- 48|- 49|||||- 50- 51- 51- 52- 52- 52- 52- 53||||- 53-
53- 54- 54- 54- 54- 54- 54- 55- 56- 57- 58- 59- 60- 62- 62- 63|||||||||||-
64- 64- 64- 64- 64- 64- 64- 64- 64- 65- 65- 65- 66- 66- 67- 68- 69- 70- 71-
72- 73- 74- 75- 76- 77- 78||||||||||||||||- 79- 79- 79- 79- 79- 79- 79- 79-
79- 79- 79- 79- 79- 79- 79- 79- 79- 80|- 81||||||||||||||- 82|||- 83|-
84||- 84- 84- 85- 85- 85- 85- 85- 85- 85- 85- 85- 85- 85- 85- 85- 86|- 86-
86- 86- 87- 87- 87- 88||||- 89- 89- 89|||||||||||- 90||- 90||- 91-
91||||||||||||||- 92||- 92- 92- 92|||||||||||||||- 93|||- 93- 93- 93-
93||||||- 93- 93||- 94|- 94- 94|- 94- 94- 94- 94|||||||- 94- 94||- 94|- 94 
Program received signal SIGINT, Interrupt.

 It's blocked : I've given it Ctrl-C

[Switching to Thread 16386 (LWP 8250)]
0x40033156 in nanosleep () from /lib/i686/libpthread.so.0
(gdb) info th
* 3 Thread 16386 (LWP 8250)  0x40033156 in nanosleep ()
   from /lib/i686/libpthread.so.0
  2 Thread 32769 (LWP 8249)  0x420db1a7 in poll () from /lib/i686/libc.so.6
  1 Thread 16384 (LWP 8248)  0x420459c6 in setcontext ()
   from /lib/i686/libc.so.6
(gdb) t 1
[Switching to thread 1 (Thread 16384 (LWP 8248))]#0  0x420459c6 in setcontext
    () from /lib/i686/libc.so.6
(gdb) bt
#0  0x420459c6 in setcontext () from /lib/i686/libc.so.6
#1  0x081cc920 in ?? ()
#2  0x0806217b in stack_extend () at eval.c:8474
(gdb) stepi 24
8427        switch (n) {
(gdb) bt
#0  rb_thread_switch (n=1) at eval.c:8427
#1  0x08062945 in rb_thread_schedule () at eval.c:8930
#2  0x4003274e in __pthread_sighandler () from /lib/i686/libpthread.so.0
#3  <signal handler called>
#4  0x420459c6 in setcontext () from /lib/i686/libc.so.6
#5  0x081cc920 in ?? ()
#6  0x0806217b in stack_extend () at eval.c:8474
(gdb) 


 If you let him continue, the pthreads will block

(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
[Switching to Thread 16386 (LWP 8250)]
0x40033156 in nanosleep () from /lib/i686/libpthread.so.0
(gdb) info th
* 3 Thread 16386 (LWP 8250)  0x40033156 in nanosleep ()
   from /lib/i686/libpthread.so.0
  2 Thread 32769 (LWP 8249)  0x420db1a7 in poll () from /lib/i686/libc.so.6
  1 Thread 16384 (LWP 8248)  0x420459d5 in setcontext ()
   from /lib/i686/libc.so.6
(gdb) t 1
[Switching to thread 1 (Thread 16384 (LWP 8248))]#0  0x420459d5 in setcontext
    () from /lib/i686/libc.so.6
(gdb) bt
#0  0x420459d5 in setcontext () from /lib/i686/libc.so.6
#1  0x08062307 in rb_thread_restore_context (th=0x81cc920, exit=0)
    at eval.c:106
#2  0x0806217b in stack_extend () at eval.c:8474
(gdb) 



Guy Decoux