Coroutine

Hamigaki.Coroutine on x64

手始めにHamigaki.Coroutineをx64に移植しました。 差分 Win32ではファイバーデータのポインタがfs:[0x10]に入っていましたが、Win64ではgs:[0x20]になるようです。 また、ファイバーでないスレッド用のダミーポインタ値は0x00001E00のままで動いているので…

コルーチンのスタック

半日ほどデバッガと格闘した後、コルーチンに割り当てたスタックが小さすぎることに気が付きました。 スタックサイズの既定値を8Kから64Kに変えてみたところ、クラッシュが発生しなくなりました。 差分 昨日クラッシュしていた箇所はどちらもI/O絡みで、バッ…

Hamigaki.CoroutineのTutorial その3

「ジェネレータ」と「コールバック関数」のセクションを追加しました。 ジェネレータの差分 コールバック関数の差分 ビルド済みのものはこちら http://hamigaki.sourceforge.jp/doc/html/coroutine/tutorial.html よく考えてみると、コールバック関数を反復…

Hamigaki.CoroutineのTutorial その2

ようやくTutorialを書き始めました。 tutorial.xml ビルド済みのものはこちら http://hamigaki.sourceforge.jp/doc/html/coroutine/tutorial.html Boost.Coroutineのドキュメントでは整数の半開区間を取り上げているのですが、これだとコルーチンの意味があ…

コンテキスト設定ミス発覚

W.DeeさんからHamigaki.Coroutineでクラッシュする報告を受けたので調べたところ、Fiberのコンテキストを保存する部分にバグを見つけました。 Boost.Coroutineのコード見てよく分からず削っていた部分が原因でした。(そりゃバグりますよね) 今日の差分 例外…

Boost.Asio + Coroutine

まもなくBoost 1.35 RC1リリースということで、Boost.Asioを弄ってみました。 Boost.Asioの非同期メカニズムはよくできているんですが、処理待ちのたびにコールバックするためどうしても処理の流れが分かりにくくなります。 そこで、Hamigaki.Coroutineを使…

abnormal_exit

吉里吉里のW.DeeさんからBoost.Coroutineだとabnormal_exitが送出される場面で、Hamigaki.Coroutineだとcoroutine_exitedが送出されるとの指摘を受けたので、abnormal_exitを実装してみました。 差分 abnormal_exitはコルーチン内で例外を捕捉しなかった場合…

constなcoroutine

boost::functionと違って、boost::coroutines::shared_coroutineはoperator()が非constになっています。 コルーチンは明らかに状態を持っていて、operator()はその状態を変更するわけなので、直感的には正しく思えます。 しかし、shared_coroutineの名前の通…

yieldの引数

以前「難しそう」と書いていましたが不便だったので、yield()の引数にtupleの要素をバラバラに渡せるようにしました。 coroutine_template.hppの差分 これで、 typedef coro::coroutine<std::pair<int,int>(int)> coroutine_type; std::pair<int,int> coro_body(coroutine_type::self& se</int,int></std::pair<int,int>…

コピーコンストラクタ追加

shared_coroutineのコピーコンストラクタが抜けていたので追加しました。 coroutine_template.hppの差分 これでSTLコンテナに格納できるはずです。

続 コルーチンのバグ調査

なぜかバグの発生確率が下がってしまって、なかなかデバッグが捗りません。 クラッシュ時にgdbも道連れにするので、逆アセンブルリストと睨めっこしながらVC++のデバッガで調べています。 デバッガで追った限り、コルーチンの例外フレームに関するロジックは…

コルーチンのバグ調査

引き続き、昨日のクラッシュを調査中です。 いくつか条件は絞り込めてきましたが、原因解明には至っていません。 で、直接関係はないのですが、バグを見つけたので修正しました。 coroutine_template.hpp コルーチンを1回も呼ばずにexit()かデストラクタが…

例外フレーム

今日は、MinGW版action_gameが終了時にクラッシュすることに気が付いてデバッグしていました。 デバッグ中にSjLj例外の環境でコルーチン側の例外フレームがリークするバグが見つかったので修正しました。 coroutine_template.hppの差分 問題の箇所はココです…

coroutines::processor

Boost.Coroutineのドキュメントの「Further Development」の項にgeneratorのOutput Iteratorなるものが書かれているのを見つけたので、一足先に実装してみました。 <hamigaki/coroutine/processor.hpp> いつも通りテストコードの抜粋を貼っておきます。 typedef coro::processor<int> processor_type</int></hamigaki/coroutine/processor.hpp>…

yield_to

coroutine::selfにyield_to()を実装しました。 まずはyield_to()の概要から説明しましょう。 typedef coro::coroutine<void()> coroutine1_type; typedef coro::coroutine<void()> coroutine2_type; void coroutine1_body(coroutine1_type::self& self); void coroutine2_bod</void()></void()>…

shared_coroutine

shared_coroutineもサポートしました。 加えてcoroutineにはmove semanticsっぽいコピー操作(単にauto_ptrに入れただけ)を追加です。 <hamigaki/coroutine/detail/coroutine_template.hpp> coroutineとshared_coroutineの違いはauto_ptrとshared_ptrの違いみたいなものです。 現状のBoost.Coroutineの実装ではin</hamigaki/coroutine/detail/coroutine_template.hpp>…

posix::user_context_impl

coroutineのコードを整理しつつ、POSIXのucontextを使った実装も追加しました。 <hamigaki/coroutine/detail/posix_user_context.hpp> スタック用のメモリはHamigaki.Detailのvirtual_memoryを使っています。 Hamigaki.Detailはヘッダファイルからインクルードしないはずでしたが、早くも破綻です。 ucontextはf</hamigaki/coroutine/detail/posix_user_context.hpp>…

続 coroutineの引数対応

Boost.Preprocessorで3引数以上にも対応しました。 かなり読みにくくなっています。 <hamigaki/coroutine/detail/coroutine_template.hpp> 内部で boost::functionN < R,self&,T1,T2,...,Tn > を使っているため、コルーチンの引数は(BOOST_FUNCTION_MAX_ARGS-1)個までに制限されます。(つまり既定では9個まで) </hamigaki/coroutine/detail/coroutine_template.hpp>…

coroutineの引数対応

pthread_contextに引き続き、fiber_contextも作成しました。 <hamigaki/coroutine/detail/fiber_context.hpp> これに合わせて、coroutineも変更です。 <hamigaki/coroutine/detail/coroutine0.hpp> ここまでは、クラス構成を変更しただけです。 次に1引数の場合、 <hamigaki/coroutine/detail/coroutine1.hpp> operator()の引数とyield()の戻り値が加わります。 2引数になると、 </hamigaki/coroutine/detail/coroutine1.hpp></hamigaki/coroutine/detail/coroutine0.hpp></hamigaki/coroutine/detail/fiber_context.hpp>

ContextImplコンセプト

現時点のHamigaki.Coroutineのcoroutineは引数なし戻り値ありのコルーチンのみ対応しています。 coroutineのレベルで複数の実装を吸収しているため、これを汎用化させると実装ごとに汎用化の作業が発生してしまい、よくありません。 coroutineより下のレベル…

Enumerate問題 解決

http://d.hatena.ne.jp/y-hamigaki/20060407 から悩み続けてきたEnumerate系関数のiterator化もHamigaki.Coroutineのおかげでようやく解決しました。 今やDirectSoundデバイスとDirectSoundCaptureデバイスはIteratorで列挙可能です。 direct_sound.hppの差…

続々 Cygwin vs Fiber

やっぱりスタックをコピーするだけでは駄目なようなので、諦めてスレッドを使った実装を追加しました。 <hamigaki/coroutine/detail/thread_coroutine.hpp> 実装にBoost.Threadを使ったので、別途ライブラリのリンクが必要です。 コルーチンが別スレッドで動作するため、呼び出し元とスレッド固有領域が別にな</hamigaki/coroutine/detail/thread_coroutine.hpp>…

続 Cygwin vs Fiber

とりあえず昨日の戦略でうまくいきました。(9/2追記: バグってました。クラッシュします。) <hamigaki/coroutine/detail/cygwin/cyg_tls.hpp> 怪しげなキャストでファイバコンテキストの中身にアクセスしている箇所はOSのバージョンによっては動かないかもしれません。これは要調査、と。 実装で問題になっ</hamigaki/coroutine/detail/cygwin/cyg_tls.hpp>…

Cygwin vs Fiber

そもそもCygwinではFiberが動かないようです。 http://www.cygwin.com/ml/cygwin/2004-12/msg00085.html MLの投稿にレスも付いてませんし、このコードは今のバージョンでも動きません。 いろいろ試した結果、ファイバ関数の中でCRT関数を呼ばない限り落ちな…

sjlj-exceptions

意外と簡単に--enable-sjlj-exceptionsなg++でも動くようになりました。 gccのソースを追ったところ、例外ハンドラに関する情報はスレッド固有領域にある、SjLj_Function_Context構造体で管理されていました。 この構造体は、 struct SjLj_Function_Context …

hamigaki::generator

VC++7.1/8.0、Borland5.82、CodeWarrior8.3で動くものができました。 <hamigaki/coroutine/coroutine.hpp> <hamigaki/coroutine/generator.hpp> クラステンプレートgeneratorの性質上、ヘッダファイルをインクルードするだけで使えないといけません。 その一方、Fiberを用いたコルーチンの実装にはどうしてもwindows.h(と、そこか</hamigaki/coroutine/generator.hpp></hamigaki/coroutine/coroutine.hpp>…

続 Fiberを使ってみる

昨日の続きです。 generatorの実装のため、coroutineに戻り値と中断処理を追加しました。 // コルーチン終了/中断時に投げられる class exit_exception : public std::exception {}; namespace coro_detail { enum state { none, // 通常 exiting, // 呼び出…

Fiberを使ってみる

Boost.Coroutineがacceptされるまで待てないので、勉強がてら簡易版の作成を画策中です。 WindowsのFiberも使ったことなかったので、まずはそちらを弄ってみました。

Boost.Coroutineでスクリプト

yotto-kさんのLuaサンプルをBoost.Coroutineでやってみました。 http://www12.ocn.ne.jp/~dante98/src/non_visual_novel.cpp スクリプト部分はほぼ同じように書けます。 void main() { msg("まってくださいませ。"); int count = 0; while (true) { ++count;…

Boost.Coroutine

Google Summer Of Code 2006(SoC 2006)のプロジェクトの一つとして、C++でコルーチンを使えるようにするBoost.Coroutineというものがあります。 http://lists.boost.org/Archives/boost/2006/08/109369.php これを使えば、ここやここで議論していた列挙コー…