]> git.cworth.org Git - apitrace/blob - common/os_workqueue.hpp
e41d8b27db3ef547ceb14502ddd9ecb0c4dac33d
[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         pthread_t handle;
27         std::queue<WorkQueueWork *> work_queue;
28
29         bool busy;
30         bool exit_workqueue;
31         pthread_cond_t wake_cond;
32         pthread_cond_t complete_cond;
33
34         os::mutex lock;
35
36         void wake_up_thread(void);
37         void thread_entry(void);
38         int run_tasks(void);
39         friend void *WorkQueue__entry_thunk(void *data);
40 public:
41         void queue_work(WorkQueueWork *work);
42         void flush(void);
43         void destroy(void);
44
45         WorkQueue(void);
46         ~WorkQueue();
47 };
48
49 }
50
51 #endif