WvStreams
|
00001 /* -*- Mode: C++ -*- */ 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; // used for resuming the task 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 // run() and yield() return the 'val' passed to run() when this task 00084 // was started. 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