C言語でコルーチン(co-routine)(3)

C言語でコルーチンを実装してみる、その3。
前回でローカル変数の問題、状態を制御できない問題は解決した。今回はコルーチンで値を返す処理を追加した。例によって、まずはサンプルコードから。
int num_gen(coroutine_t coro)
{
co_begin_rettype(coro,int);
co_local_valiables{
int number;
};
co_local.number = 0;
while(1){
co_yield_ret(co_local.number++);
}
co_end;
}

int main(int argc, char *argv[])
{
coroutine_t gen1;
coroutine_t gen2;
int stack1[128];
int stack2[128];
int i;

gen1 = co_create(num_gen,0,stack1,sizeof(stack1));
gen2 = co_create(num_gen,0,stack2,sizeof(stack2));

for(i=0;i<10;i++){
co_call(gen1);
co_call(gen2);
printf("gen1 result %d,gen2 result %d\n",
co_get_retval(gen1,int),
co_get_retval(gen2,int));
}
}
実行結果は次の通り。
% a.exe
gen1 result 0,gen2 result 0
gen1 result 1,gen2 result 1
gen1 result 2,gen2 result 2
gen1 result 3,gen2 result 3
gen1 result 4,gen2 result 4
gen1 result 5,gen2 result 5
gen1 result 6,gen2 result 6
gen1 result 7,gen2 result 7
gen1 result 8,gen2 result 8
gen1 result 9,gen2 result 9
num_gen関数はint型の値を、呼び出し毎に1ずつ増やして返す関数だ。今回追加したマクロはco_begin_rettype,co_yield_ret,co_get_retvalだ。順番に見ていこう。
  • co_begin_rettype(coro,int);
    コルーチンの開始と戻り値の型を決める。戻り値のサイズ分、スタックに空きを作る。
  • co_yield_ret(co_local.number++);
    スタックに戻り値を積んで、処理を中断し呼び出しもとに戻る。
  • co_get_retval(gen1,int)
    コルーチンの戻り値を型を指定して取り出す。
気になる(?)実装は次の通り。
#define co_begin_rettype(coro,type) \
type *__return_addr = (type*)((coro)+1); \
co_stack_t __stack_addr = (co_stack_t)(((int)(__return_addr+1)+3)&~3); \
switch((coro)->resume){ \
case CO_INITIALALIZE:;

#define co_yield_ret(value) \
do{ \
*__return_addr=value; \
return(__LINE__); \
case __LINE__:; \
}while(0)

#define co_get_retval(coro,type) \
(*((type*)((coro)+1)))
ローカル変数で使うスタックのアライメントを4バイトに調節している。

コメント

Secret

Ads by Google
最近の記事
カテゴリ
テルミン (5)
スタバカップアンプ (8)
電光掲示板 (4)
Arduino (25)
Make: (19)
太陽電池 (12)
ニキシー管 (17)
PICライタ (15)
自作USBデバイス (6)
電波時計 (3)
Ogg Vorbis Player (12)
電子工作 (69)
Xfind (6)
Cocoa (18)
Bluetooth (3)
twitter (4)
Coroutine (4)
本 (3)
Android (1)
未分類 (21)
Make Controller (1)
Amazon.co.jp
最近のコメント
arms22:Make: Tokyo Meeting 04 行ってきました。 (11/24)
kuma3:Make: Tokyo Meeting 04 行ってきました。 (11/24)
arms22:Make: Tokyo Meeting 04 行ってきました。 (11/24)
LIC:Make: Tokyo Meeting 04 行ってきました。 (11/24)
yatto:Arduinoで遊ぼう - LEDドットマトリクス (10/30)
arms22:スタバカップアンプに最適なスピーカ (10/28)
まりす:スタバカップアンプに最適なスピーカ (10/28)
arms22:Arduinoで遊ぼう - LEDドットマトリクス (10/28)
最近のトラックバック
以前の記事
リンク
タグ
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。