WvStreams
wvwin32task.h
1 /* -*- Mode: C++ -*- */
2 #ifndef __WVWIN32TASK_H
3 #define __WVWIN32TASK_H
4 
5 #include "wvstring.h"
6 #include "wvlinklist.h"
7 
8 #include <windows.h>
9 
10 #define WVTASK_MAGIC 0x123678
11 
12 class WvTaskMan;
13 
14 class WvTask
15 {
16  friend class WvTaskMan;
17  typedef void TaskFunc(void *userdata);
18 
19  static int taskcount, numtasks, numrunning;
20  int magic_number, *stack_magic;
21  WvString name;
22  int tid;
23 
24  size_t stacksize;
25  bool running, recycled;
26 
27  WvTaskMan &man;
28  LPVOID mystate; // used for resuming the task
29 
30  TaskFunc *func;
31  void *userdata;
32 
33  static VOID CALLBACK MyFiberProc(PVOID lpParameter);
34  WvTask(WvTaskMan &_man, size_t _stacksize = 64*1024);
35 
36 public:
37  virtual ~WvTask();
38 
39  void start(WvStringParm _name, TaskFunc *_func, void *_userdata);
40  bool isrunning() const
41  { return running; }
42  void recycle();
43  int get_tid() const { return tid; }
44  WvString get_name() const { return name; }
45 };
46 
47 
48 DeclareWvList(WvTask);
49 
51 class WvTaskMan
52 {
53  friend class WvTask;
54 
55  static WvTaskMan *singleton;
56  static int links;
57 
58  static int magic_number;
59  static WvTaskList free_tasks;
60 
61  static void get_stack(WvTask &task, size_t size);
62  static void stackmaster();
63  static void _stackmaster();
64  static void do_task();
65 
66  static WvTask *stack_target;
67 
68  static WvTask *current_task;
69  static LPVOID toplevel;
70 
71  WvTaskMan();
72  virtual ~WvTaskMan();
73 
74 public:
76  static WvTaskMan *get();
77  static void unlink();
78 
79  WvTask *start(WvStringParm name,
80  WvTask::TaskFunc *func, void *userdata,
81  size_t stacksize = 256*1024);
82 
83  // run() and yield() return the 'val' passed to run() when this task
84  // was started.
85  static int run(WvTask &task, int val = 1);
86  static int yield(int val = 1);
87 
88  static WvTask *whoami()
89  { return current_task; }
90 };
91 
92 #endif // __WVWIN32TASK_H
WvTaskMan
Provides co-operative multitasking support among WvTask instances.
Definition: wvtask.h:81
WvTask
Represents a single thread of control.
Definition: wvtask.h:34
WvString
WvString is an implementation of a simple and efficient printable-string class.
Definition: wvstring.h:329
WvTaskMan::get
static WvTaskMan * get()
get/dereference the singleton global WvTaskMan
Definition: wvtask.cc:139