送信メッセージキューイング

メッセージキューイング

一般的に、MessageServer で送信をする為には post() 関数を用いる。 post() は実際の送信こそ turn() 時に遅延されるが、送信バッファへの書き込みは同期的に行われる。 このため、送信バッファが一杯だと失敗する欠点がある

バッファへの書き込みを遅延処理したい場合のために、nine では queue/flow/cancel の関数群を提供している。

      bool queue(int id, Message* pMsg, const SendContext* pCtx);
      bool flow(int id);
      bool cancel(int id, Message* pMsg);

bool queue(int id, Message* pMsg, const SendContext* pCtx)

queue() は、メッセージを送信キューへと追記する。実際に書き出されるのは、以後の turn() か flow() の時点になる。

post() はその時点で書かれるが、queue() は turn() か flow() の時点で書かれる。 queue() を呼んだ後に post() を呼んだ場合、後から post() したメッセージが先に相手へ届くことになるので、順序が重要な場合には注意が必要である。

SendContext には遅延評価に関するコールバック関数などを指定する:
class SendContext
{
   public:
      enum Result {
         SUCCESS, CANCEL, FAIL,
      };
      void(*callback)(Message*, SendContext::Result, void* data);

      void* data;
      bool toDelete;
};
  • callback は送信バッファへの書き込み完了後に呼びだされるコールバック関数を指定する。
  • data は、コールバック関数の第三引数に渡される。ユーザー側で任意に利用してよい。
  • toDelete が真の場合、nine 側でメッセージオブジェクトを delete する。偽の場合は何もしない。
実際には、関数ポインタ callback と、真偽値 toDelete の組み合わせにより 4通りの動作が行われる。
callback toDelete 動作
指定

バッファ書き込み後に callback 関数が呼ばれる。

メッセージオブジェクトの delete はされない。必要ならば callback関数内で delete する必要がある。

指定

バッファ書き込み後に callback 関数が呼ばれる。

コールバック関数呼び出し後に、nine 側でメッセージオブジェクトの delete を行う。

NULL

バッファ書き込み後、何もしない。

サービス実行中はずっと確保され、値に変更のない定数メッセージの場合に用いる。

NULL

バッファ書き込み後、nine 側でメッセージオブジェクトを delete する。

正常に完了したかの確認が不要で、ヒープ上に確保したメッセージに用いる。

bool flow(int id)

送信キューに溜まったメッセージオブジェクトを、可能な限り送信バッファへ書きだす。

この処理は turn() 内で暗黙に行われるため、アプリケーションが明示的に呼びだす必要性はほとんど無い。

cancel(int id, Message* pMsg)

送信キューに残っているメッセージオブジェクトをキャンセルする。

メッセージの同一性判定はポインタで行われる。後にキャンセルする可能性のあるメッセージは、そのポインタを保持しておく必要がある。

キャンセルされたメッセージはコールバック処理が行われる。この場合の Result は CANCEL になっている。