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
00046
00047
class WvTaskMan
00048 {
00049
friend class WvTask;
00050
00051
static WvTaskMan *singleton;
00052
static int links;
00053
00054
int magic_number;
00055
WvTask *current_task;
00056 WvTaskList free_tasks;
00057
00058
void get_stack(
WvTask &task, size_t size);
00059
void stackmaster();
00060
void _stackmaster();
00061
void do_task();
00062
00063
WvTask *stack_target;
00064
00065 LPVOID toplevel;
00066
00067
WvTaskMan();
00068
virtual ~
WvTaskMan();
00069
00070
public:
00071
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
int run(
WvTask &task,
int val = 1);
00082
int yield(
int val = 1);
00083
00084 WvTask *
whoami()
const
00085
{
return current_task; }
00086 };
00087