Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | 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 Wed Dec 15 15:08:11 2004 for WvStreams by  doxygen 1.3.9.1