C++で継続・コルーチン

タスク定義をどうするかが問題。なんとかcontinuation(継続)をC++でかけないものか。

必要なのは、いわゆるプログラムカウンタ(+レジスタ群)の保存と、スタック上のローカル変数データの保持。

FSMモデルならなんとかかけます。(参考:d:id:yaneurao:20040525)
保存が必要なデータはメンバ変数にすればOK。でもこれだとプログラムが恐ろしく汚くなるんだよな。

やりたいことはスタックポインタ入れ替えてsetjmpなんだけど、これのポータブルな実装を自前でやるのは絶望的すぎる。というか例外使ってるプログラムだとどうなるんだっけ?

と、書いてる途中にBinary Hacksに似たようなネタがあったのを思い出す。

ありましたありました。

Boost好きとしてはBoost::coroutineかと思いきや、draftっぽいので回避。
PCLとPthを検討してみます。

PCLとGNU Pth

5分で両方のAPIリファレンスを流し読みしただけなので、あんまり参考にしないように。

Pthはpthread互換APIを目指してるようなかんじ。APIがみょーに多い。システムコールがスレッドの中で呼ばれることを気にしている様子。(あの悪しきスレッドキャンセルへの対応をきちんとやっている印象)

PCLは500行未満のライブラリで、本当にsetjmp/longjmp+スタック交換のみみたい。

というわけでPCLを使おうと思うのだけれども、例外処理がどうなるのか不安。Windowsゲームプログラミング2によると、Windows/VC++環境だとSEH用のスタックポインタがfs[0]に保存されているらしい。これを退避させておけばよさそうだ。g++の場合は例外処理の実装が2種類あったはずだし、もうちょっとややこしくなりそう。調査が必要。

続・mt-daapd

メモリ食いつぶして異常終了する問題はあるmp3のid3タグが壊れていたため。

ogg-transcodeはsscのプラグインは認識されている。日本語ファイル名でもogg拡張子は確認されている。ファイルパスもinodeから参照しているようなので無問題。
どこだろう?

今日はここまで。