]> git.cworth.org Git - apitrace/blob - common/os_workqueue.hpp
f8ab84c66cb3437a78e32883d435b62e31401298
[apitrace] / common / os_workqueue.hpp
1 #ifndef _OS_WORKQUEUE_HPP_
2 #define _OS_WORKQUEUE_HPP_
3
4 #include <queue>
5
6 #include "os_thread.hpp"
7
8 namespace os {
9
10
11 class WorkQueue;
12
13 class WorkQueueWork {
14 protected:
15     friend class WorkQueue;
16
17 public:
18     virtual void run(void) = 0;
19     virtual ~WorkQueueWork(void) { }
20 };
21
22 extern "C"
23 void *WorkQueue__entry_thunk(void *data);
24
25 class WorkQueue {
26     std::queue<WorkQueueWork *> work_queue;
27
28     bool busy;
29     bool exit_workqueue;
30     os::condition_variable wake_cond;
31     os::condition_variable complete_cond;
32
33     os::mutex mutex;
34
35     os::thread thread;
36
37     void wake_up_thread(void);
38     void thread_entry(void);
39     int run_tasks(void);
40     friend void *WorkQueue__entry_thunk(void *data);
41 public:
42     void queue_work(WorkQueueWork *work);
43     void flush(void);
44     void destroy(void);
45
46     WorkQueue(void);
47     ~WorkQueue();
48 };
49
50 }
51
52 #endif