From: GOTOU YUUZOU Date: 2000-10-13T13:22:18+09:00 Subject: [ruby-dev:11196] malloc trouble in thread ごとうゆうぞうです。 スレッドでがんがん IO を使うようなプログラムを FreeBSD で実行すると、例えば、次のようになります。 $ ruby -v ruby 1.6.1 (2000-09-27) [i386-freebsdelf5.0] $ cat th.rb require 'thread' while true Thread.start{ io = open("/dev/zero") io.read(100) io.close } end $ ruby th.rb ruby in realloc(): error: recursive call. Abort trap (core dumped) gdb で info stack すると次のような感じになっています。 #0 0x2814c22c in kill () from /usr/lib/libc.so.4 #1 0x2818b016 in abort () from /usr/lib/libc.so.4 #2 0x28189b31 in isatty () from /usr/lib/libc.so.4 #3 0x28189b67 in isatty () from /usr/lib/libc.so.4 #4 0x2818ad6f in realloc () from /usr/lib/libc.so.4 #5 0x8063a51 in ruby_xrealloc (ptr=0x848a000, size=6096) at gc.c:117 #6 0x805d6a7 in rb_thread_save_context (th=0x8487c00) at eval.c:6748 #7 0x805e3aa in rb_thread_schedule () at eval.c:7187 #8 0x805f081 in catch_timer (sig=26) at eval.c:7702 #9 0xbfbfffac in ?? () #10 0x2818a4d1 in isatty () from /usr/lib/libc.so.4 #11 0x2818abe1 in malloc () from /usr/lib/libc.so.4 #12 0x281890f0 in __smakebuf () from /usr/lib/libc.so.4 #13 0x2817981f in __srefill () from /usr/lib/libc.so.4 #14 0x281796fc in __srget () from /usr/lib/libc.so.4 #15 0x8067f24 in io_fread (ptr=0x8488300 ' , len=100, f=0x281a9370) at io.c:447 #16 0x80681e2 in io_read (argc=1, argv=0xbfbfe380, io=135179368) at io.c:547 #17 0x8057f40 in call_cfunc (func=0x806810c , recv=135179368, len=-1, argc=1, argv=0xbfbfe380) at eval.c:4018 #18 0x8058425 in rb_call0 (klass=135263248, recv=135179368, id=6545, argc=1, argv=0xbfbfe380, body=0x80fefb0, nosuper=1) at eval.c:4157 スレッドの仕組みはちゃんと判っていないので参考までに、 __srget(つまり getc)の途中でスレッドが切り替わっているん ではないかと思ったので、TRAP_BEG のついでに SIGVTALRM を ブロックして、TRAP_END で復帰するような細工をしてみたと ころ、いちおう動いているようです。 -- ごとうゆうぞう