Shiro Kawai
shiro****@lava*****
2004年 1月 2日 (金) 22:12:55 JST
FreeBSD 4.8-RELEASE の環境にアクセスできたので試していました。 多分これだと思います。 =================================================================== RCS file: /cvsroot/gauche/Gauche/src/main.c,v retrieving revision 1.73 diff -c -r1.73 main.c *** main.c 27 Dec 2003 12:54:10 -0000 1.73 --- main.c 2 Jan 2004 12:58:24 -0000 *************** *** 179,184 **** --- 179,188 ---- sigdelset(&set, SIGUSR1); /* used in linux threads */ sigdelset(&set, SIGUSR2); /* used in linux threads */ #endif /*SCM_LINUX_SIGNALS&&GAUCHE_USE_PTHREADS*/ + #if defined(GC_FREEBSD_THREADS) + sigdelset(&set, SIGUSR1); /* used by GC to stop the world */ + sigdelset(&set, SIGUSR2); /* used by GC to restart the world */ + #endif /*GC_FREEBSD_THREADS*/ Scm_SetMasterSigmask(&set); } =================================================================== gcのソースを見たら、FREEBSDでもSIGUSR[12]をstop the worldに 使っていました (gc/include/private/gcconfig.h)。 奇妙なことに、OPENBSDやNETBSDではreal time signalの方が使われてる ようです(gc/include/private/gc_priv.h)。 上記パッチが無いと、SUGUSR[12]をGaucheがマスクしてしまいます。 問題のコードでは、メインスレッドが accept() で待ち、サブスレッドの 方でstop the world GCが発生すると、GCは全スレッドを止めるために メインスレッドにSIGUSR1を送るのですが、そのハンドラをGaucheが 横取りしているためにメインスレッドはそれに応答せず、そこで固まって しまう、というのが原因でした。 --shiro