FreeBSD QandA 833
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 まで
お知らせください。