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