Rustに出てきたosaka.rsにちょっと興味惹かれたので読んでみたときの個人メモosaka.rsとは?mioをベースに、asyncもどきの#[osaka]とawait!もどきのsync!を実装したお試し非同期フレームワークという感じ。};返り値をosaka::Task<>でラップしている。syn::ReturnType::Defaultは返り値無しの関数の場合。};関数のブロックをラッピングしてstd::ops::Generatorを作ってすぐにresume()で実行し、作ったジェネレータと中断結果(完了した場合はosaka::Task::immediate)を返す関数を作り、それをf.blockに代入することで元の関数を作り変えている。この#[osaka]はどんな関数にも付けられるというものではなく、ブロック内部でyield(または後述のsync!)を呼んでいる必要があるため、どちらかというとジェネレータを普通の関数に見せかける仕組みという方が正しいように思う。};};}引数の$taskは#[osaka]付きの関数(?)で生成されたosaka::Taskまたはジェネレータ。yieldを上へと伝搬させていくawait!もどきの役割。Task::run()ブロックしてイベントを待つ。}mio::Poll::poll()でイベントを待って、来たら対応するtoken.activeを有効にする。}poll()を呼んでイベントを処理。Doneなら上に返る。Againならloopで再度mio::Poll::poll()のイベント待ちへ。Task::poll()osaka::Future::poll()の実装。osaka::Task)に対してFuture::poll()を実行しFutureResultを返す。動かすものがないならそのままAgainを返す。Arc<mio::Poll>,}イベント待ちをするための情報。Task::Laterのメンバーとしてsync!で伝搬していき、Task::run()でイベント待ちするときに利用される。poll.againから再開して応答を受信。test()ではresolve()で作ったタスクをsync!で同期的に待つだけ。test(poll).run().unwrap();}以下雑多なメモこれ、test()に#[osaka]付ける必要あるのではないだろうか。以降test()に#[osaka]付いてる前提で話を進める。あとこのままだといろいろコンパイルは通らないので動かすためには結構修正必要。#[osaka]の効果でresolve()ではosaka::Task<>が返る。test()もosaka::Task<>を返す。test()のブロックもジェネレータ化されているので、最初の呼出でresolve()を呼んでsync!の中で上のLaterに対してpoll()を実行する。最初の呼び出しては通常イベントは発生していないので上にAgainが返って、そのAgainを元にTaskが作られてtest(poll)の返り値となる。上の返り値にさらにTask::run()を実行する。Task::run()はブロッキングメソッドでmio::Poll::poll()を使って実際にブロッキングでイベント待ちをおこなう。イベントが来た場合はTask::poll()を呼び出す。あとは「mio::Poll::poll()してTask::poll()」の処理を全ての処理が終わるまで繰り返す。