Ticket #25872

マルチコア レンダラの xlib 対応(ウィンドウ処理)

Date d'ouverture: 2011-07-31 23:37 Dernière mise à jour: 2011-08-09 17:11

Rapporteur:
Propriétaire:
État:
Atteints
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Aucun
Fichier:
Aucun

Détails

ウィンドウ処理に関する Win32API の X API ポーティング(Linux 対応)

Ticket History (3/3 Histories)

2011-07-31 23:37 Updated by: chiharunpo
  • New Ticket "マルチコア レンダラの xlib 対応(ウィンドウ処理)" created
2011-08-07 22:37 Updated by: chiharunpo
Commentaire

プロキシ・パターンを使用して、Win32 と xlib を切り分ける処理は実装しました。Win32 版は相変わらず動いています。xlib 版は XImage 周りがちょっと煩雑で苦戦中。パラメータに何設定すればいいんだ…コレ。わっかりづらっ!私のスキルが足りんのかっ!こんちくしょー。

―――今週前半で何とかやりきらないと。

2011-08-09 17:11 Updated by: chiharunpo
  • État Update from Ouvert to Atteints
  • Ticket Close date is changed to 2011-08-09 17:11
Commentaire

X11 (xlib) のスレッド非セーフっぷりにどはまりしました。

―――結局動いたからよかったのですが、何なんでしょう。なんだあの API 群は!整備されていないにも程がある…。

X11 のスレッド セーフ化

おまじないレスで X11 API をスレッド間で非同期呼び出しするとプログラムが高確率で異常終了します。

これに対して、すべての X11 API 呼び出しの前に XInitThreads API を呼び出すことで対処しました。この対応で一部の X11 API がカーネル オブジェクト(だと思う)で正常にロック & 排他処理されるようになりました。

XNextEvent 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 上でパラレル・フォースが描画されるようになりました。よかったよかった。

Attachment File List

No attachments

Modifier

Please login to add comment to this ticket » Connexion