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;
+}