2009年3月23日月曜日

boost::asio で pop3 (4)

 今回は、セッション・クラスの破棄についてです。シングル・スレッド感覚で扱える boost::asio ですが、boost::asio::deadline_timer を利用してセッション・クラスを破棄しようと思うと、物凄く難しくなります。結論から言うと、shared_ptr か intrusive_ptr のように参照カウントを管理しないと、破棄できません。
 この難しさは、どこから来るか?と言うと、キューに溜まっている deadline_timer の処理と、通常の送受信ハンドラの処理順序を制御する事ができないところからきます。通信が正常に終了した場合には、deadline_timer のハンドラが残っていますし、キャンセル処理した場合には、これに加えて通常のハンドラがキャンセルされてコールされます。キャンセル時のハンドラの処理順序は規格上不定です。
 よって、気持ちの悪い enable_shared_from_this を利用します。
tr1 だと memory、boost だと enable_shared_from_this.hpp なのでしょうか…。クラスをmixin(侵入継承?)させます。

class hoge : public enable_shared_from_this<hoge> {
...
};

としておいてから、ハンドラの登録時に

boost::bind( // tr1::bind
&hoge::handle_wrote,
shared_from_this(),
boost::asio::placeholders::error
)

とハンドラを指定します。
・・・続く

0 件のコメント: