Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

wvwin32task.h

Go to the documentation of this file.
00001 /* -*- Mode: C++ -*- */ 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; // used for resuming the task 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 /** Provides co-operative multitasking support among WvTask instances. */ 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 /// get/dereference the singleton global WvTaskMan 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 // run() and yield() return the 'val' passed to run() when this task 00080 // was started. 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

Generated on Tue Oct 5 01:09:21 2004 for WvStreams by doxygen 1.3.7