1 /* -*- Mode: C++ -*- */
2 #ifndef __WVWIN32TASK_H
3 #define __WVWIN32TASK_H
6 #include "wvlinklist.h"
10 #define WVTASK_MAGIC 0x123678
16 friend class WvTaskMan
;
17 typedef void TaskFunc(void *userdata
);
19 static int taskcount
, numtasks
, numrunning
;
20 int magic_number
, *stack_magic
;
25 bool running
, recycled
;
28 LPVOID mystate
; // used for resuming the task
33 static VOID CALLBACK
MyFiberProc(PVOID lpParameter
);
34 WvTask(WvTaskMan
&_man
, size_t _stacksize
= 64*1024);
39 void start(WvStringParm _name
, TaskFunc
*_func
, void *_userdata
);
40 bool isrunning() const
43 int get_tid() const { return tid
; }
44 WvString
get_name() const { return name
; }
48 DeclareWvList(WvTask
);
50 /** Provides co-operative multitasking support among WvTask instances. */
55 static WvTaskMan
*singleton
;
58 static int magic_number
;
59 static WvTaskList free_tasks
;
61 static void get_stack(WvTask
&task
, size_t size
);
62 static void stackmaster();
63 static void _stackmaster();
64 static void do_task();
66 static WvTask
*stack_target
;
68 static WvTask
*current_task
;
69 static LPVOID toplevel
;
75 /// get/dereference the singleton global WvTaskMan
76 static WvTaskMan
*get();
79 WvTask
*start(WvStringParm name
,
80 WvTask::TaskFunc
*func
, void *userdata
,
81 size_t stacksize
= 256*1024);
83 // run() and yield() return the 'val' passed to run() when this task
85 static int run(WvTask
&task
, int val
= 1);
86 static int yield(int val
= 1);
88 static WvTask
*whoami()
89 { return current_task
; }
92 #endif // __WVWIN32TASK_H