OSSIA
Open Scenario System for Interactive Application
lockfree_queue.hpp
1 #pragma once
2 
3 // TSAN seems to have some trouble with ReaderWriterQueue...
4 #if !defined(OSSIA_FREESTANDING)
5 
6 #if defined(__has_feature)
7 #if __has_feature(thread_sanitizer)
8 #include <concurrentqueue.h>
9 namespace ossia
10 {
11 template <typename T, size_t MAX_BLOCK_SIZE = 512>
12 using spsc_queue = moodycamel::ConcurrentQueue<T>;
13 }
14 #else
15 #include <readerwriterqueue.h>
16 namespace ossia
17 {
18 template <typename T, size_t MAX_BLOCK_SIZE = 512>
19 using spsc_queue = moodycamel::ReaderWriterQueue<T, MAX_BLOCK_SIZE>;
20 }
21 #endif
22 #else
23 #include <readerwriterqueue.h>
24 namespace ossia
25 {
26 template <typename T, size_t MAX_BLOCK_SIZE = 512>
27 using spsc_queue = moodycamel::ReaderWriterQueue<T, MAX_BLOCK_SIZE>;
28 }
29 #endif
30 
31 #include <concurrentqueue.h>
32 namespace ossia
33 {
34 template <typename T>
35 using mpmc_queue = moodycamel::ConcurrentQueue<T>;
36 }
37 #else
38 // Will only be used on one thread anyways
39 #include <vector>
40 namespace ossia
41 {
42 template <typename T>
43 struct minimal_queue
44 {
45 public:
46  bool try_dequeue(T& t)
47  {
48  if(impl.empty())
49  return false;
50  t = std::move(impl.back());
51  impl.pop_back();
52  return true;
53  }
54 
55  void enqueue(T&& t) { impl.insert(impl.begin(), std::move(t)); }
56 
57 private:
58  std::vector<T> impl;
59 };
60 template <typename T>
61 using spsc_queue = ossia::minimal_queue<T>;
62 template <typename T>
63 using mpmc_queue = ossia::minimal_queue<T>;
64 }
65 #endif
Definition: git_info.h:7