ちらうら
I/O Completion Portの設計。
どうしようか悩みすぎ・・あうあう
ちょっと整理する意味でチラシの裏的な何か。
「ここはお前の日記帳じゃないんだ、チラシの裏にでも書いてろ、な?」
ちなみにソースはフィクションなのでコンパイルはできません
こんな風に使いたい。使えたらいいな。
completion_port port; file f1,f2; socket s; buffer b;//memoryじゃなくbufferなのは、同期処理をするから calc c;//I/Oと関係ない計算。この前やったやつ。たとえばDBから取得した生データをファイル形式に・・とか piple_line p(port);//完了ポートと関連付け p(f1>>b>>c>>(f2,s));//ファイルから読み込んでバッファに入れて加工して別のファイルとソケットに書き込んでね line.start_io();//作業開始
終了処理は普通に
//終わるのを待つ line.wait();
これは非同期の意味があるのか・・
せっかくなのでコールバック
// completion_portのスレッドから呼ばれる line.onComplete=complete_handler;
まだこっちのがいいけど、completion_portのWorkerスレッドから呼ばれるのが
コールバック関数の中でもスレッド間の同期処理を考えないといけないのが痛い
// mainのスレッドから呼んでほしい場合は内部でinvokeしてね part3 { line.onComplete=delegator(complete_handler,mainthread_callback); while(1) { // でもその場合はプーリングしないとだめ?messageじゃなくてEventとかでね line.pooling(); } }
これがいいんだけどパフォーマンス的にIOCPの意味があるのか謎な・・
基本的にcompletion_portは完了通知とスレッドを提供してくれるだけで
piple_lineは完了通知を受け取ってoutputからinputに垂れ流すだけ
ここはシンプルでいいのかな。
問題はbuffer。
ファイルから読み込んだデータをバッファにコピーするのでf>>bでいいし
バッファの内容をソケットに出力するのだからb>>sでいいと思う。
この場合同じバッファを使ったほうが効率言いわけだからf>>b>>sとなる
まぁここまではいいんだけど、そもそもバッファはメモリであって
memcpyを非同期で行うわけじゃない。
しかもfやsへの入出力は必ずバッファが必要になる
予め分かってるならf>>sでいいんじゃない?
でもその場合、ファイルから読み込む処理だけの場合はどう書くんだろう
p(f)
だけ?うーん・・・
もしpile_lineの仕事が
piple_lineは完了通知を受け取ってoutputからinputに垂れ流すだけ
ただしpile_lineは最高で1つの出力用バッファ(要するに出口)もしくは入力用バッファ(入り口)のみ受け付ける
その他のbufferはpiple_lineが自動的に管理する
だとすると・・
p(f1>>b>>c>>(f2,s));
は
p(f1>>c>>(f2,s));
になる
この場合pipe_lineは内部バッファを
f1>>b1>>c>>b2>>(f2,s)
と勝手に作ればおk
ソケットからデータを受信するには
p(s>>b)
と書く。
この場合pipe_lineは内部バッファを作らない。
どっちがいいの・・うーん・・
ちらうらすぎて困る