wvdbusserver: implement NameHasOwner request.
[wvstreams.git] / include / wvwin32task.h
bloba67374c16795844874de9dbd9d3338b9aba93105
1 /* -*- Mode: C++ -*- */
2 #ifndef __WVWIN32TASK_H
3 #define __WVWIN32TASK_H
5 #include "wvstring.h"
6 #include "wvlinklist.h"
8 #include <windows.h>
10 #define WVTASK_MAGIC 0x123678
12 class WvTaskMan;
14 class WvTask
16 friend class WvTaskMan;
17 typedef void TaskFunc(void *userdata);
19 static int taskcount, numtasks, numrunning;
20 int magic_number, *stack_magic;
21 WvString name;
22 int tid;
24 size_t stacksize;
25 bool running, recycled;
27 WvTaskMan &man;
28 LPVOID mystate; // used for resuming the task
30 TaskFunc *func;
31 void *userdata;
33 static VOID CALLBACK MyFiberProc(PVOID lpParameter);
34 WvTask(WvTaskMan &_man, size_t _stacksize = 64*1024);
36 public:
37 virtual ~WvTask();
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; }
48 DeclareWvList(WvTask);
50 /** Provides co-operative multitasking support among WvTask instances. */
51 class WvTaskMan
53 friend class WvTask;
55 static WvTaskMan *singleton;
56 static int links;
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;
71 WvTaskMan();
72 virtual ~WvTaskMan();
74 public:
75 /// get/dereference the singleton global WvTaskMan
76 static WvTaskMan *get();
77 static void unlink();
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
84 // was started.
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