Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/simple_pack/main.cpp @ 53:0c8ae614d421
Initial revision
author | chiaki |
---|---|
date | Fri, 15 Feb 2008 20:58:50 +0900 |
parents | |
children | 35a6cf176c38 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/simple_pack/main.cpp Fri Feb 15 20:58:50 2008 +0900 @@ -0,0 +1,187 @@ +#include <iostream> +#include "viewer.h" +#include "polygon.h" +#include "demonstration.h" +#include "pad.h" +#include "TaskManager.h" +using namespace std; + +int init(void*, void*); +int sdl_init(void*, void*); +int zrow_init(void*, void*); +int run(void*, void*); +int finish(void*, void*); + +extern void task_initialize(); + +TaskManager *manager; +Viewer *screen; + +struct init_arg { + int bpp; + int w; + int h; +}; + +int init(void *_arg, void *w) +{ + struct init_arg *arg; + int fd_sdl_init, fd_zrow_init, fd_run; + HTaskPtr task_sdl_init, task_zrow_init, task_run; + + arg = (struct init_arg *)_arg; + + screen = new Viewer(arg->bpp, arg->w, arg->h); + + fd_sdl_init = manager->open("sdl_init"); + fd_zrow_init = manager->open("zRow_init"); + fd_run = manager->open("run"); + + task_sdl_init = manager->create_task(fd_sdl_init, 0, 0, 0, NULL); + task_zrow_init = manager->create_task(fd_zrow_init, 0, 0, 0, NULL); + task_run = manager->create_task(fd_run, 0, 0, 0, NULL); + + manager->set_task_depend(task_sdl_init, task_run); + manager->set_task_depend(task_zrow_init, task_run); + + //task_sdl_init->set_depend(..); + //task_sdl_init->spawn(); + + manager->spawn_task(task_sdl_init); + manager->spawn_task(task_zrow_init); + manager->spawn_task(task_run); + + free(arg); + return 0; +} + + +// クラス関数は単純にポインタで扱えないので +// 現状は間接的に呼ぶことに +int sdl_init(void *r, void *w) +{ + screen->sdl_init(); + return 0; +} + +int zRow_init(void *r, void *w) +{ + screen->zRow_init(); + return 0; +} + +int run(void *r, void *w) +{ + screen->run_init(); + return 0; +} + +int run_loop(void *r, void *w) +{ + screen->run_loop(); + return 0; +} + +int run_draw(void *r, void *w) +{ + screen->run_draw(); + return 0; +} + +int run_finish(void *r, void *w) +{ + screen->run_finish(); + return 0; +} + + +int finish(void *w, void *r) +{ + delete screen; + return 0; +} + +// 上の init() が代わりに動いてます +int run_test(int bpp, int width, int height) +{ + Viewer *screen; + screen = new Viewer(bpp, width, height); + //screen->init(); + screen->sdl_init(); + + //Scene *scene; + //scene = new Scene; + + screen->zRow_init(); + //screen->scene = scene; + screen->run_init(); + + //delete scene; + delete screen; + + return(0); +} + + +int main(int argc, char *argv[]) +{ + manager = new TaskManager(1); + manager->init(); + + task_initialize(); + + // 本当は、dlsym みたいなものを使いたいんだけど + // 静的なやつはできないん? + manager->set_symbol("init", (void*)init); + manager->set_symbol("sdl_init", (void*)sdl_init); + manager->set_symbol("zRow_init", (void*)zRow_init); + manager->set_symbol("run", (void*)run); + manager->set_symbol("finish", (void*)finish); + manager->set_symbol("ViewerRunLoop", (void*)run_loop); + manager->set_symbol("ViewerRunDraw", (void*)run_draw); + manager->set_symbol("ViewerRunFinish", (void*)run_finish); + + int bpp = 0; + int width = 640; + int height = 480; + + for(int i = 1; argv[i]; ++i) + { + if (strcmp(argv[i], "-bpp") == 0) + { + bpp = atoi(argv[++i]); + } + if (strcmp(argv[i], "-width") == 0) + { + width = atoi(argv[++i]); + } + if (strcmp(argv[i], "-height") == 0) + { + height = atoi(argv[++i]); + } + } + +#if 0 + run_test(bpp, width, height); +#else + // 一番最初に行われる init 専用の task_run があってもいいけど。。 + // その場合は引数とか固定か。まあ引数は argc, argv を持つ + // 構造体で固定しても問題はない・・・か? + HTaskPtr task_init; + int fd_init; + struct init_arg *arg = new struct init_arg; + + arg->bpp = bpp; + arg->w = width; + arg->h = height; + + fd_init = manager->open("init"); + task_init = manager->create_task(fd_init, sizeof(struct init_arg), + (unsigned int)arg, 0, NULL); + manager->spawn_task(task_init); + manager->run(); +#endif + + finish(NULL, NULL); + return 0; +}