[C][Lua]カタがコルーチンの続きです。
前回、コルーチンの生成/呼び出しにLuaを使ってましたが、
数が多くなってくると生成/呼び出し関数を作るのが面倒です。
そこで、Cから直接コルーチンを呼び出す方法です。
int _tmain(int argc, _TCHAR* argv[]){
lua_State *L = lua_open(), *co;
luaL_openlibs(L);
luaL_dofile(L, "test.lua");
co = lua_newthread(L);
lua_getglobal(co, "f");
for(;;){
lua_resume(co, 0);
if (lua_type(co, -1) == LUA_TNIL) break;
printf("%s\n", lua_tostring(co, -1));
if (_getch() == 27) break;
}
lua_close(L);
return 0;
}
新たにcoというlua_Stateを定義し、lua_resumeを呼ぶだけです。
引数を渡すときはco側に積み、返り値もco側に積まれます。
ただ、いくつか問題があって、このコルーチンを途中で破棄したいとしても
明示的にコルーチンを破棄する方法はありません。
しかし、解放されないわけではなく、GCによって自動的に解放されます。
Lのスタックを見てみると、lua_newthread()を実行した時点で、スタックが一つ増えています。
これがコルーチンの情報で、スタックに乗り続ける限り参照ありとしてGCの対象から外れます。
そして、スタックから取り除けば、そのうちGCによって解放されます。
つまり、コルーチンを使っている間はスタックから取り除いてはいけません。
今回のようにひとつだけ、というのであればこのままでも問題ありませんが、
たくさんのコルーチンを使うとなると、スタックで管理というのはいただけません。
これを何とかする方法もあるのですが、本格的にコルーチンを実装するとなると、
C側で管理するより、Lua側でコルーチンライブラリを作って管理した方が良いのではないかという気がします。