ログイン
編集不可のページディスカッション情報添付ファイル
"clear/wm_devel/2012-12-23"の差分

MMA
2と3のリビジョン間の差分
2013-01-02 16:00:11時点のリビジョン2
サイズ: 2590
編集者: clear
コメント:
2013-01-26 16:54:13時点のリビジョン3
サイズ: 3091
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 28: 行 28:
  * 失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う   * 成功/失敗の確定を待つので遅くなる。失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う
行 33: 行 33:
  * 大量のリクエストを連続して行う場合(アトム値の取得など)、最初に全てのリクエストを送ってからリプライを取得する
   * Xlibでは設計上このようにすることができず、1つづつリクエスト->リプライ取得を行うためにXCBより遅くなりがち
行 39: 行 41:

なぜXCBがXlibより速くなるのかはチュートリアルに書いてある: http://xcb.freedesktop.org/tutorial/

XCBのリクエスト処理

xcb-requests(3)を読んでまとめただけ。

Xクライアントがサーバに対して送るリクエストは2種類ある。

  • リプライを要求しないもの
    • 単純に要求のみを行うもの。例えばMapRequest

    • リクエストの結果は、それが成功したか失敗したかのみ
  • リプライを要求するもの
    • 「何かを取得する」リクエストがこれにあたる。例えばInternAtom

    • 成否の他に、リクエスト成功時はリプライが来る

さらに、XCBではエラーハンドリングの方法が2つ用意されている。

  • checked
    • リクエストを投げる関数が成功/失敗が確定するまでブロックする。エラーは即座に確認できる
    • リプライを要求するリクエストに関してはこちらがデフォルト
  • unchecked
    • リクエストを投げる関数がブロックしない。発生したエラーはイベントループで通知される
    • リプライを要求しないリクエストに関してはこちらがデフォルト

以上2*2=4通りの方法が存在する。

  • リプライなし、unchecked(デフォルト)
    • リクエストを投げるときは対応する関数を呼ぶだけ。リプライがないので本当にそれだけ
    • エラーはイベントループで検出
  • リプライなし、checked
    • XXX_checkedのように、関数名に_checkedというサフィックスがつく

    • 帰ってきたcookieをxcb_request_checkに渡すとエラーの有無が分かる

    • 成功/失敗の確定を待つので遅くなる。失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う
  • リプライあり、checked(デフォルト)
    • checkedだがリプライなしの方とは違ってサフィックスはない
    • XXXという関数に対してXXX_replyという関数でリプライを取得する。このとき同時にエラーの有無を取得する

    • 結果が必要なので普通はこれを使えばいいはず
    • 大量のリクエストを連続して行う場合(アトム値の取得など)、最初に全てのリクエストを送ってからリプライを取得する
      • Xlibでは設計上このようにすることができず、1つづつリクエスト->リプライ取得を行うためにXCBより遅くなりがち

  • リプライあり、unchecked
    • 今度は逆に_uncheckedというサフィックスがつく

    • リプライの取得方法は同じ。エラーはイベントループで検出
    • 今ひとつ使いどころが分からないが、manを読む限りリクエストを投げてからリプライを受け取るまでに他の処理を行うような場合を想定している?

リクエストのバッファリングについて参考: http://lists.freedesktop.org/archives/xcb/2008-December/004152.html

なぜXCBがXlibより速くなるのかはチュートリアルに書いてある: http://xcb.freedesktop.org/tutorial/

clear/wm_devel/2012-12-23 (最終更新日時 2013-03-08 17:11:26 更新者 clear)