OGLplus (0.52.0) a C++ wrapper for OpenGL

example_mt.hpp
Go to the documentation of this file.
1 
9 #ifndef __OGLPLUS_EXAMPLE_EXAMPLE_MT_1119071146_HPP__
10 #define __OGLPLUS_EXAMPLE_EXAMPLE_MT_1119071146_HPP__
11 
12 #include <cassert>
13 
14 #include <queue>
15 #include <mutex>
16 #include <condition_variable>
17 
18 
19 namespace oglplus {
20 
21 class ExampleSyncQueue
22 {
23 private:
24  std::queue<Sync> sync_queue;
25  std::mutex sync_mutex;
26  std::condition_variable sync_cv;
27  bool cancelled;
28 public:
29  ExampleSyncQueue(void)
30  : cancelled(false)
31  { }
32 
33  ExampleSyncQueue(ExampleSyncQueue&& tmp)
34  : sync_queue(std::move(tmp.sync_queue))
35  , sync_mutex()
36  , sync_cv()
37  , cancelled(tmp.cancelled)
38  {
39  tmp.cancelled = true;
40  }
41 
42  ExampleSyncQueue& operator = (ExampleSyncQueue&& tmp)
43  {
44  sync_queue = std::move(tmp.sync_queue);
45  cancelled = tmp.cancelled;
46  tmp.cancelled = true;
47  return *this;
48  }
49 
50  ~ExampleSyncQueue(void)
51  {
52  Cancel();
53  }
54 
55  void Cancel(void)
56  {
57  std::unique_lock<std::mutex> l(sync_mutex);
58  if(!cancelled)
59  {
60  cancelled = true;
61  std::queue<Sync> empty;
62  std::swap(sync_queue, empty);
63  sync_cv.notify_all();
64  }
65  }
66 
67  void Push(Sync&& sync)
68  {
69  std::unique_lock<std::mutex> l(sync_mutex);
70  sync_queue.emplace(std::move(sync));
71  sync_cv.notify_all();
72  }
73 
74  void Signal(void)
75  {
76  Push(Sync());
77  }
78 
79  Sync Pop(void)
80  {
81  std::unique_lock<std::mutex> l(sync_mutex);
82  while(sync_queue.empty() && !cancelled) sync_cv.wait(l);
83  Sync tmp(cancelled?Sync():std::move(sync_queue.front()));
84  if(!cancelled) sync_queue.pop();
85  return std::move(tmp);
86  }
87 
88  void Wait(void)
89  {
90  Pop().Wait();
91  }
92 };
93 
94 class ExampleFrameSyncQueue
95 {
96 private:
97  std::mutex sync_mutex;
98  std::condition_variable sync_cv;
99  std::queue<Sync> sync_queue;
100  std::queue<GLuint> value_queue;
101  bool cancelled;
102 public:
103  ExampleFrameSyncQueue(void)
104  : cancelled(false)
105  { }
106 
107  ExampleFrameSyncQueue(ExampleFrameSyncQueue&& tmp)
108  : sync_mutex()
109  , sync_cv()
110  , sync_queue(std::move(tmp.sync_queue))
111  , value_queue(std::move(tmp.value_queue))
112  , cancelled(tmp.cancelled)
113  {
114  tmp.cancelled = true;
115  }
116 
117  ExampleFrameSyncQueue& operator = (ExampleFrameSyncQueue&& tmp)
118  {
119  sync_queue = std::move(tmp.sync_queue);
120  value_queue = std::move(tmp.value_queue);
121  cancelled = tmp.cancelled;
122  tmp.cancelled = true;
123  return *this;
124  }
125 
126  ~ExampleFrameSyncQueue(void)
127  {
128  Cancel();
129  }
130 
131  void Cancel(void)
132  {
133  std::unique_lock<std::mutex> l(sync_mutex);
134  if(!cancelled)
135  {
136  cancelled = true;
137  std::queue<Sync> tsq;
138  std::queue<GLuint> tvq;
139  std::swap(sync_queue, tsq);
140  std::swap(value_queue, tvq);
141  sync_cv.notify_all();
142  }
143  }
144 
145  void Push(GLuint value)
146  {
147  std::unique_lock<std::mutex> l(sync_mutex);
148  sync_queue.push(Sync());
149  value_queue.push(value);
150  sync_cv.notify_all();
151  }
152 
153  GLuint Pop(void)
154  {
155  std::unique_lock<std::mutex> l(sync_mutex);
156  while(!cancelled && sync_queue.empty()) sync_cv.wait(l);
157 
158  if(!cancelled)
159  {
160  sync_queue.front().Wait();
161  sync_queue.pop();
162 
163  GLuint result = value_queue.front();
164  value_queue.pop();
165  return result;
166  }
167  else return 0;
168  }
169 };
170 
171 } // namespace oglplus
172 
173 #endif // include guard

Copyright © 2010-2014 Matúš Chochlík, University of Žilina, Žilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Mon Sep 22 2014 by Doxygen (version 1.8.6).