マルチコア レンダラの xlib 対応(ウィンドウ処理)
プロキシ・パターンを使用して、Win32 と xlib を切り分ける処理は実装しました。Win32 版は相変わらず動いています。xlib 版は XImage 周りがちょっと煩雑で苦戦中。パラメータに何設定すればいいんだ…コレ。わっかりづらっ!私のスキルが足りんのかっ!こんちくしょー。
―――今週前半で何とかやりきらないと。
X11 (xlib) のスレッド非セーフっぷりにどはまりしました。
―――結局動いたからよかったのですが、何なんでしょう。なんだあの API 群は!整備されていないにも程がある…。
おまじないレスで X11 API をスレッド間で非同期呼び出しするとプログラムが高確率で異常終了します。
これに対して、すべての X11 API 呼び出しの前に XInitThreads API を呼び出すことで対処しました。この対応で一部の X11 API がカーネル オブジェクト(だと思う)で正常にロック & 排他処理されるようになりました。
当該 API でイベント待ち中に別スレッドで XPutImage API したら高確率で XPutImage API がフリーズしました。
for (;;) { XNextEvent(aDisplay, &aEvent); // これがスレッド非セーフっぽい switch (aEvent.type) { // イベント応答 } }イベント待機直前に XPending API でポーリングし、確実にイベントが存在する状況下で XLockDisplay, XUnlockDisplay API でロック中に XNextEvent API を使用することで対処しました。
for (;;) { while (XPending(aDisplay)) { // XNextEvent をマニュアル ロック! XLockDisplay(aDisplay); XNextEvent(aDisplay, &aEvent); XUnlockDisplay(aDisplay); switch (aEvent.type) { // イベント応答 } } }とりあえず上記で正常動作するようになりました。まだ PC 環境ですが、X-Window 上でパラレル・フォースが描画されるようになりました。よかったよかった。
ウィンドウ処理に関する Win32API の X API ポーティング(Linux 対応)