This is a multi-part message in MIME format.
--------------020904020209090002050207
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Suraj N. Kurapati wrote:
> Nobuyoshi Nakada wrote:
>> Your example does create new thread outside of ruby, the
>> interpreter doesn't know about the thread.  You should use
>> rb_thread_create() instead.
> 
> I tried your suggestion, but it did not work very well for me (see
> below).  Perhaps I wrote a poor implementation?

I tried a different implementation (see attached tarball) this time,
using the Queue class for thread synchronization.  The example now
works in Ruby 1.8.6, but not in 1.9.0 (see below).

Why does this example fail with Ruby 1.9.0 ?

Thanks for your consideration.


##### With Ruby 1.8.6 #####

$ sh make.sh
ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux]
checking for ruby_init() in -lruby... no
checking for ruby_init() in -lruby-static... no
creating Makefile
/usr/lib/ruby/1.8/mkmf.rb:1110: warning: global variable `$preload'
not initialized
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I.  -fPIC
-fno-strict-aliasing -g -O2  -fPIC  -c main.c
cc  -o main.so main.o -L"." -L"/usr/lib" -L.  -rdynamic
-Wl,-export-dynamic    -lruby1.8  -lpthread -ldl -lcrypt -lm   -lc
C: RUBY_INIT_STACK
C: ruby_init()
C: ruby_init_loadpath()
C: rb_thread_create()
R: BEGIN (ad-hoc from rb_thread_create())
R: wait for C
C: relay to Ruby -- begin
C: wake up Ruby
R: BEGIN (synchronized with C)
R: {:current=>#<Thread:0xb7c5f3e8 run>, :main=>#<Thread:0xb7c6c700 run>}
./hello.rb: delay 1
C: wait for Ruby
./hello.rb: delay 2
./hello.rb: delay 3
R: relay to C -- begin
R: wake up C
C: relay to Ruby -- end
C: relay to Ruby -- begin
C: wake up Ruby
R: wait for C
R: relay to C -- end
R: wake up C
R: END
C: wait for Ruby
C: relay to Ruby -- end
C: Thread.list => [#<Thread:0xb7c6c700 run>]
C: ruby_finalize()
C: exit


##### With Ruby 1.9.0 #####

$ sh make.sh
ruby 1.9.0 (2007-12-25 revision 14709) [i686-linux]
/home/sun/app/ruby19/lib/ruby/1.9.0/mkmf.rb:1082: warning: empty
expression
/home/sun/app/ruby19/lib/ruby/1.9.0/mkmf.rb:1120: warning: empty
expression
checking for ruby_init() in -lruby... no
checking for ruby_init() in -lruby-static... yes
creating Makefile
gcc -I. -I/home/sun/app/ruby19/include/ruby-1.9.0/i686-linux
-I/home/sun/app/ruby19/include/ruby-1.9.0 -I. -D_FILE_OFFSET_BITS=64
 -fPIC -g -O2   -o main.o -c main.c
gcc  -o main.so main.o -L. -L/home/sun/app/ruby19/lib
-Wl,-R/home/sun/app/ruby19/lib -L.  -rdynamic -Wl,-export-dynamic
 -lruby-static  -lpthread -lrt -ldl -lcrypt -lm   -lc
C: RUBY_INIT_STACK
C: ruby_init()
C: ruby_init_loadpath()
C: rb_thread_create()
C: relay to Ruby -- begin
C: wake up Ruby
<dummy toplevel>:17: [BUG] Segmentation fault
ruby 1.9.0 (2007-12-25 revision 14709) [i686-linux]

-- control frame ----------
c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP    <dummy toplevel>:17
---------------------------
-- backtrace of native function call (Use addr2line) --
0x80f7b0a
0x8115a0c
0x8115a7b
0x80c8b60
0xffffe440
0xb7f85cc4
0x80f559e
0x80f6994
0x805db38
0x805de30
0x805e1a5
0x805aa00
0x805ab55
0x805abc7
0xb7de5050
0x805a7d1
-------------------------------------------------------
Aborted (core dumped)


##### Stack trace of the Ruby 1.9.0 run #####

$ gdb -c core ./main.so
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

warning: exec file is newer than core file.

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/tls/i686/cmov/libpthread.so.0...done.
Loaded symbols for /lib/tls/i686/cmov/libpthread.so.0
Reading symbols from /lib/tls/i686/cmov/librt.so.1...done.
Loaded symbols for /lib/tls/i686/cmov/librt.so.1
Reading symbols from /lib/tls/i686/cmov/libdl.so.2...done.
Loaded symbols for /lib/tls/i686/cmov/libdl.so.2
Reading symbols from /lib/tls/i686/cmov/libcrypt.so.1...done.
Loaded symbols for /lib/tls/i686/cmov/libcrypt.so.1
Reading symbols from /lib/tls/i686/cmov/libm.so.6...done.
Loaded symbols for /lib/tls/i686/cmov/libm.so.6
Reading symbols from /lib/tls/i686/cmov/libc.so.6...done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Core was generated by `./main.so'.
Program terminated with signal 6, Aborted.
#0  0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7df9875 in raise () from /lib/tls/i686/cmov/libc.so.6
#2  0xb7dfb201 in abort () from /lib/tls/i686/cmov/libc.so.6
#3  0x08115a80 in rb_compile_bug (
    file=0x813b6b1
"\023\b\023\b\023\b(\023\bx\023\b\023\b\023\b(¡±\023\bp¡±\023\b¡­¡±\023\b¡±\023\bD¡ë\023\b\210¡ë\023\b¡ë¡ë\023\b¡ë\023\b$¡Þ\023\bp¡Þ\023\b¡Þ\023\b¡Þ\023\b\f\023\b",

    line=0, fmt=0x2348 <Address 0x2348 out of bounds>) at error.c:239
#4  0x080c8b60 in sigsegv (sig=11) at signal.c:534
#5  <signal handler called>
#6  0xb7df967c in siglongjmp () from /lib/tls/i686/cmov/libc.so.6
#7  0xb7f85cc4 in siglongjmp () from /lib/tls/i686/cmov/libpthread.so.0
#8  0x080f559e in vm_eval_body (th=0x8170160) at vm.c:1326
#9  0x080f6994 in vm_call0 (th=0x8170160, klass=3084007260,
recv=3084005960, id=9112,
    oid=4408, argc=1, argv=0xbfe1d410, body=0xb7d236d0, nosuper=0)
at vm_insnhelper.c:45
#10 0x0805db38 in rb_call0 (klass=3084007260, recv=3084005960,
mid=9112, argc=1,
    argv=0xbfe1d410, scope=3, self=4) at eval.c:1405
#11 0x0805de30 in rb_f_send (argc=1, argv=0xbfe1d410, recv=3) at
eval.c:1504
#12 0x0805e1a5 in rb_funcall (recv=<value optimized out>, mid=9112, n=1)
    at ./include/ruby/ruby.h:896
#13 0x0805aa00 in relay_to_c () at main.c:68
#14 0x0805ab55 in the_c_program () at main.c:120
#15 0x0805abc7 in the_c_program () at main.c:132
#16 0xb7de5050 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
#17 0x0805a7d1 in _start ()
(gdb) bt full
#0  0xffffe410 in __kernel_vsyscall ()
No symbol table info available.
#1  0xb7df9875 in raise () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#2  0xb7dfb201 in abort () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#3  0x08115a80 in rb_compile_bug (
    file=0x813b6b1
"\023\b\023\b\023\b(\023\bx\023\b\023\b\023\b(¡±\023\bp¡±\023\b¡­¡±\023\b¡±\023\bD¡ë\023\b\210¡ë\023\b¡ë¡ë\023\b¡ë\023\b$¡Þ\023\bp¡Þ\023\b¡Þ\023\b¡Þ\023\b\f\023\b",

    line=0, fmt=0x2348 <Address 0x2348 out of bounds>) at error.c:239
	args = 0x6 <Address 0x6 out of bounds>
#4  0x080c8b60 in sigsegv (sig=11) at signal.c:534
No locals.
#5  <signal handler called>
No symbol table info available.
#6  0xb7df967c in siglongjmp () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#7  0xb7f85cc4 in siglongjmp () from /lib/tls/i686/cmov/libpthread.so.0
No symbol table info available.
#8  0x080f559e in vm_eval_body (th=0x8170160) at vm.c:1326
	i = <value optimized out>
	catch_iseqval = 0
	escape_dfp = (VALUE *) 0x0
	type = 3219247740
	epc = 6
	cont_pc = <value optimized out>
	cont_sp = <value optimized out>
	_tag = {buf = {{__jmpbuf = {-1210269800, -1210961336, -1210793956,
-1075719400,
        -677101439, 178833390}, __mask_was_saved = 0, __saved_mask =
{__val = {3086671808,
          3219247824, 3086420848, 3219247876, 3086671808,
3086729148, 3219247808,
          3219248036, 2090266759, 8, 3084725324, 3084725276,
3773176208, 2090266758,
          3086462264, 3086461704, 0, 0, 1, 2229, 3086421456,
3086419976, 3086467711,
          3084761180, 3219247976, 3084173340, 135725408, 135057177,
0, 3219248052,
          3086672230, 3084007260}}}}, tag = 0, retval = 3219247928,
prev = 0x0}
	state = 6
	result = <value optimized out>
	err = 3084005720
#9  0x080f6994 in vm_call0 (th=0x8170160, klass=3084007260,
recv=3084005960, id=9112,
    oid=4408, argc=1, argv=0xbfe1d410, body=0xb7d236d0, nosuper=0)
at vm_insnhelper.c:45
	i = <value optimized out>
	val = <value optimized out>
	blockptr = <value optimized out>
#10 0x0805db38 in rb_call0 (klass=3084007260, recv=3084005960,
mid=9112, argc=1,
    argv=0xbfe1d410, scope=3, self=4) at eval.c:1405
	body = (NODE *) 0xb7d236d0
	method = <value optimized out>
	noex = 0
	id = 4408
	ent = (struct cache_entry *) 0x0
	th = (rb_thread_t *) 0x8170160
#11 0x0805de30 in rb_f_send (argc=1, argv=0xbfe1d410, recv=3) at
eval.c:1504
No locals.
#12 0x0805e1a5 in rb_funcall (recv=<value optimized out>, mid=9112, n=1)
    at ./include/ruby/ruby.h:896
	argv = (VALUE *) 0xbfe1d410
	ar = 0xbfe1d470 "¥Ä¥¥¥Ä¥¥\005\b4¥Æ¥¢\025\b¥Ä¥£¥ÆÈÅ¡£¥Ä¥½U¥Ä¥©\005\b¥Æ¡¼¥Ä¥£\005\b"
---Type <return> to continue, or q <return> to quit---
#13 0x0805aa00 in relay_to_c () at main.c:68
No locals.
#14 0x0805ab55 in the_c_program () at main.c:120
	variable_in_this_stack_frame = 134589034
	cQueue = 135655732
#15 0x0805abc7 in the_c_program () at main.c:132
	variable_in_this_stack_frame = 134589383
	cQueue = 3219248336
#16 0xb7de5050 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#17 0x0805a7d1 in _start ()
No symbol table info available.
(gdb)

--------------020904020209090002050207
Content-Type: application/x-gzip;
 name="embed-ruby-1.9-thread.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="embed-ruby-1.9-thread.tar.gz"

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
--------------020904020209090002050207--