一般的に、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);
queue() は、メッセージを送信キューへと追記する。実際に書き出されるのは、以後の turn() か flow() の時点になる。
post() はその時点で書かれるが、queue() は turn() か flow() の時点で書かれる。 queue() を呼んだ後に post() を呼んだ場合、後から post() したメッセージが先に相手へ届くことになるので、順序が重要な場合には注意が必要である。
class SendContext
{
public:
enum Result {
SUCCESS, CANCEL, FAIL,
};
void(*callback)(Message*, SendContext::Result, void* data);
void* data;
bool toDelete;
};
| callback | toDelete | 動作 |
|---|---|---|
| 指定 | 偽 |
バッファ書き込み後に callback 関数が呼ばれる。 メッセージオブジェクトの delete はされない。必要ならば callback関数内で delete する必要がある。 |
| 指定 | 真 |
バッファ書き込み後に callback 関数が呼ばれる。 コールバック関数呼び出し後に、nine 側でメッセージオブジェクトの delete を行う。 |
| NULL | 偽 |
バッファ書き込み後、何もしない。 サービス実行中はずっと確保され、値に変更のない定数メッセージの場合に用いる。 |
| NULL | 真 |
バッファ書き込み後、nine 側でメッセージオブジェクトを delete する。 正常に完了したかの確認が不要で、ヒープ上に確保したメッセージに用いる。 |
送信キューに溜まったメッセージオブジェクトを、可能な限り送信バッファへ書きだす。
この処理は turn() 内で暗黙に行われるため、アプリケーションが明示的に呼びだす必要性はほとんど無い。
送信キューに残っているメッセージオブジェクトをキャンセルする。
メッセージの同一性判定はポインタで行われる。後にキャンセルする可能性のあるメッセージは、そのポインタを保持しておく必要がある。
キャンセルされたメッセージはコールバック処理が行われる。この場合の Result は CANCEL になっている。