[Gauche-devel-jp] Re: Thread 内での open-input-file について

アーカイブの一覧に戻る

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







Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る