FreeBSD QandA 833

FreeBSD QandA

Q. pthread(3) を用いて Multi thread な X プログラムを作ったのですが、
   実行してみると、
     XIO:  fatal IO error 0 (Undefined error: 0) on X server ":0.0"
           after 13 requests (13 known processed) with 0 events remaining.
   とエラーを出して終了してしまいます。

A. FreeBSD に付属の XFree86 はライブラリが Thread Safe になっていないので、
   Thread Safeなライブラリを作り直す必要があります。

   まず、XFree86のソースを展開し、xc/config/cf ディレクトリの中に
   次のような内容の host.def というファイルを作ります。

   --- host.def
   #define HasPosixThreads         YES
   #define ThreadedX               YES
   #define HasThreadSafeAPI        YES
   #define ThreadsLibraries        -lc_r
   #define SystemMTDefines         -D_THREAD_SAFE -D_REENTRANT
   --- end of host.def

   この後 xc ディレクトリに戻り、make World して下さい。
   make が終わったら make install するか、xc/lib 以下にできたライブラリ一式を
   /usr/X11R6/lib にコピーして下さい。

   Xのライブラリが Thread Safe かどうかは、 関数 XInitThreads() の戻り値を
   調べることで分かります。詳しくは man XInitThreads を参照して下さい。

   2.2.6-RELEASE 以前では上記の方法でライブラリを入れ替えると libc に関数 
   __errno が用意されていないために、pthread を使わない(正確には libc_r を
   リンクしていない)X プログラムが動かなくなってしまうという問題が発生します。
   2.2.7-RELEASE 以降を使って下さい。

   また、Xのライブラリに限らず、Multi thread なプログラムは _THREAD_SAFE を
   define しておく必要があります。こちらについても、詳しくは errno(2) を
   参照して下さい。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。