WvStreams
wvwin32task.h
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