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

MMA
3と4のリビジョン間の差分
2013-01-26 16:54:13時点のリビジョン3
サイズ: 3091
編集者: clear
コメント:
2013-03-08 17:11:26時点のリビジョン4
サイズ: 2704
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 11: 行 11:
  * 成否の他に、リクエスト成功時はリプライが来る   * リクエスト成功時はリプライが来る
  * 複数のリクエストを連続して行う場合、最初に全てのリクエストを送ってからリプライを取得すると効率がよい
   * 理由は[[http://xcb.freedesktop.org/tutorial/|ここ]]に書いてある
   * Xlibではリクエストの送信とリプライの取得が不可分なので、これができない
行 13: 行 16:
さらに、XCBではエラーハンドリングの方法が2つ用意されている。
 * checked
  * リクエストを投げる関数が成功/失敗が確定するまでブロックする。エラーは即座に確認できる
  * リプライを要求するリクエストに関してはこちらがデフォルト
 * unchecked
  * リクエストを投げる関数がブロックしない。発生したエラーはイベントループで通知される
  * リプライを要求しないリクエストに関してはこちらがデフォルト

以上2*2=4通りの方法が存在する。
この2種類について、エラーハンドリングの方法が2つづつ(checkedとunchecked)あり、合計2*2=4通りの方法が存在する。
行 31: 行 26:
  * `XXX`という関数に対して`XXX_reply`という関数でリプライを取得する。このとき同時にエラーの有無を取得する
  * 結果が必要なので普通はこれを使えばいいはず
  * 大量のリクエストを連続して行う場合(アトム値の取得など)、最初に全てのリクエストを送ってからリプライを取得する
   * Xlibでは設計上このようにすることができず、1つづつリクエスト->リプライ取得を行うためにXCBより遅くなりがち
  * `XXX`という関数に対して`XXX_reply`という関数でリプライを取得する
  * エラーをその場で拾いたい場合はこちら。`XXX_reply`の第3引数でエラーを取得できる
行 38: 行 31:
  * 今ひとつ使いどころが分からないが、manを読む限りリクエストを投げてからリプライを受け取るまでに他の処理を行うような場合を想定している?   * エラーが発生しても気にせず処理を続ける場合はこちら。`XXX_reply`の第3引数はNULLにする
行 40: 行 33:
リクエストのバッファリングについて参考: http://lists.freedesktop.org/archives/xcb/2008-December/004152.html

なぜXCBがXlibより速くなるのかはチュートリアルに書いてある: http://xcb.freedesktop.org/tutorial/
Xlibと違って、リクエストは対応する関数を実行しただけでは送信されない(バッファリングされる)。リクエストが送信される条件は以下の通り。
 * リクエストに対応するリプライを取得する
 * バッファが埋まる
 * `xcb_flush()`が呼ばれる
 * ソース: http://lists.freedesktop.org/archives/xcb/2008-December/004152.html

XCBのリクエスト処理

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

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

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

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

    • リクエスト成功時はリプライが来る
    • 複数のリクエストを連続して行う場合、最初に全てのリクエストを送ってからリプライを取得すると効率がよい
      • 理由はここに書いてある

      • Xlibではリクエストの送信とリプライの取得が不可分なので、これができない

この2種類について、エラーハンドリングの方法が2つづつ(checkedとunchecked)あり、合計2*2=4通りの方法が存在する。

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

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

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

    • エラーをその場で拾いたい場合はこちら。XXX_replyの第3引数でエラーを取得できる

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

    • リプライの取得方法は同じ。エラーはイベントループで検出
    • エラーが発生しても気にせず処理を続ける場合はこちら。XXX_replyの第3引数はNULLにする

Xlibと違って、リクエストは対応する関数を実行しただけでは送信されない(バッファリングされる)。リクエストが送信される条件は以下の通り。

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