00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
#ifndef __WVTASK_H
00014
#define __WVTASK_H
00015
00016
#ifdef _WIN32
00017
00018
#include "wvwin32task.h"
00019
00020
#else
00021
00022
#include "wvstring.h"
00023
#include "wvlinklist.h"
00024
#include "setjmp.h"
00025
00026 #define WVTASK_MAGIC 0x123678
00027
00028
class WvTaskMan;
00029
00030
00031 class WvTask
00032 {
00033
friend class WvTaskMan;
00034
00035
00036
00037
00038
00039
00040
00041
00042
typedef void TaskFunc(
void *userdata);
00043
00044
static int taskcount, numtasks, numrunning;
00045
int magic_number, *stack_magic;
00046
WvString name;
00047
int tid;
00048
00049 size_t stacksize;
00050
bool running, recycled;
00051
00052
WvTaskMan &man;
00053 jmp_buf mystate;
00054
00055 TaskFunc *func;
00056
void *userdata;
00057
00058
WvTask(
WvTaskMan &_man, size_t _stacksize = 64*1024);
00059
00060
public:
00061
virtual ~WvTask();
00062
00063
void start(
WvStringParm _name, TaskFunc *_func,
void *_userdata);
00064 bool isrunning()
const
00065
{
return running; }
00066
void recycle();
00067 };
00068
00069
00070
DeclareWvList(
WvTask);
00071
00072
00073 class WvTaskMan
00074 {
00075
friend class WvTask;
00076
00077
static WvTaskMan *singleton;
00078
static int links;
00079
00080
static int magic_number;
00081
static WvTaskList free_tasks;
00082
00083
static void get_stack(
WvTask &task, size_t size);
00084
static void stackmaster();
00085
static void _stackmaster();
00086
static void do_task();
00087
00088
static char *stacktop;
00089
static jmp_buf stackmaster_task;
00090
00091
static WvTask *stack_target;
00092
static jmp_buf get_stack_return;
00093
00094
static WvTask *current_task;
00095
static jmp_buf toplevel;
00096
00097
WvTaskMan();
00098
virtual ~
WvTaskMan();
00099
00100
public:
00101
00102
static WvTaskMan *
get();
00103
static void unlink();
00104
00105
WvTask *
start(
WvStringParm name,
00106 WvTask::TaskFunc *func,
void *userdata,
00107 size_t stacksize = 64*1024);
00108
00109
00110
00111
static int run(
WvTask &task,
int val = 1);
00112
static int yield(
int val = 1);
00113
00114 static WvTask *
whoami()
00115 {
return current_task; }
00116 };
00117
00118
00119
#endif // ifdef _WIN32
00120
#endif // __WVTASK_H