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