]> git.sesse.net Git - nageru/blob - queue_spot_holder.h
Allow symlinked frame files. Useful for testing.
[nageru] / queue_spot_holder.h
1 #ifndef _QUEUE_SPOT_HOLDER
2 #define _QUEUE_SPOT_HOLDER 1
3
4 // A RAII class to hold a shared resource, in our case an (unordered!) spot in a queue,
5 // for as long as a frame is under computation.
6
7 class QueueInterface {
8 public:
9         virtual ~QueueInterface() {}
10         virtual void take_queue_spot() = 0;
11         virtual void release_queue_spot() = 0;
12 };
13
14 class QueueSpotHolder {
15 public:
16         QueueSpotHolder() : queue(nullptr) {}
17
18         explicit QueueSpotHolder(QueueInterface *queue) : queue(queue) {
19                 queue->take_queue_spot();
20         }
21
22         QueueSpotHolder(QueueSpotHolder &&other) : queue(other.queue) {
23                 other.queue = nullptr;
24         }
25
26         QueueSpotHolder &operator=(QueueSpotHolder &&other) {
27                 queue = other.queue;
28                 other.queue = nullptr;
29                 return *this;
30         }
31
32         ~QueueSpotHolder() {
33                 if (queue != nullptr) {
34                         queue->release_queue_spot();
35                 }
36         }
37
38         // Movable only.
39         QueueSpotHolder(QueueSpotHolder &) = delete;
40         QueueSpotHolder &operator=(QueueSpotHolder &) = delete;
41
42 private:
43         QueueInterface *queue;  
44 };
45
46 #endif // !defined(_QUEUE_SPOT_HOLDER)