00001
00002 #ifndef __WVWIN32TASK_H
00003 #define __WVWIN32TASK_H
00004
00005 #include "wvstring.h"
00006 #include "wvlinklist.h"
00007
00008 #include <windows.h>
00009
00010 #define WVTASK_MAGIC 0x123678
00011
00012 class WvTaskMan;
00013
00014 class WvTask
00015 {
00016 friend class WvTaskMan;
00017 typedef void TaskFunc(void *userdata);
00018
00019 static int taskcount, numtasks, numrunning;
00020 int magic_number, *stack_magic;
00021 WvString name;
00022 int tid;
00023
00024 size_t stacksize;
00025 bool running, recycled;
00026
00027 WvTaskMan &man;
00028 LPVOID mystate;
00029
00030 TaskFunc *func;
00031 void *userdata;
00032
00033 static VOID CALLBACK MyFiberProc(PVOID lpParameter);
00034 WvTask(WvTaskMan &_man, size_t _stacksize = 64*1024);
00035
00036 public:
00037 virtual ~WvTask();
00038
00039 void start(WvStringParm _name, TaskFunc *_func, void *_userdata);
00040 bool isrunning() const
00041 { return running; }
00042 void recycle();
00043 int get_tid() const { return tid; }
00044 WvString get_name() const { return name; }
00045 };
00046
00047
00048 DeclareWvList(WvTask);
00049
00051 class WvTaskMan
00052 {
00053 friend class WvTask;
00054
00055 static WvTaskMan *singleton;
00056 static int links;
00057
00058 static int magic_number;
00059 static WvTaskList free_tasks;
00060
00061 static void get_stack(WvTask &task, size_t size);
00062 static void stackmaster();
00063 static void _stackmaster();
00064 static void do_task();
00065
00066 static WvTask *stack_target;
00067
00068 static WvTask *current_task;
00069 static LPVOID toplevel;
00070
00071 WvTaskMan();
00072 virtual ~WvTaskMan();
00073
00074 public:
00076 static WvTaskMan *get();
00077 static void unlink();
00078
00079 WvTask *start(WvStringParm name,
00080 WvTask::TaskFunc *func, void *userdata,
00081 size_t stacksize = 256*1024);
00082
00083
00084
00085 static int run(WvTask &task, int val = 1);
00086 static int yield(int val = 1);
00087
00088 static WvTask *whoami()
00089 { return current_task; }
00090 };
00091
00092 #endif // __WVWIN32TASK_H