Loading...
Searching...
No Matches
ExecutionContext.hpp
1#pragma once
2#include <Process/ExecutionCommand.hpp>
3#include <Process/TimeValue.hpp>
4
5#include <ossia/detail/lockfree_queue.hpp>
6#include <ossia/detail/thread.hpp>
7#include <ossia/editor/scenario/time_value.hpp>
8
9#include <score_lib_process_export.h>
10
11#include <atomic>
12#include <memory>
13namespace ossia
14{
15class graph_node;
16class graph_interface;
17struct execution_state;
18
19#if __cplusplus > 201703L
20// TODO moveme
21static const constexpr struct disable_init_key_t
22{
23} disable_init;
24struct disable_init_t
25{
26 disable_init_t(disable_init_key_t) { }
27 disable_init_t() = delete;
28 disable_init_t(const disable_init_t&) = delete;
29 disable_init_t(disable_init_t&&) = delete;
30 disable_init_t& operator=(const disable_init_t&) = delete;
31 disable_init_t& operator=(disable_init_t&&) = delete;
32};
33#endif
34
35namespace net
36{
37class node_base;
38}
39}
40namespace score
41{
42struct DocumentContext;
43template <typename T, typename U, typename V>
44class GenericComponentFactoryList;
45}
46namespace State
47{
48struct Address;
49}
50namespace Process
51{
52class ProcessModel;
53}
54namespace Execution
55{
56struct Transaction;
57class ProcessComponent;
58class ProcessComponentFactory;
59class ProcessComponentFactoryList;
60struct SetupContext;
61namespace Settings
62{
63class Model;
64}
65
66using time_function = smallfun::function<ossia::time_value(const TimeVal&)>;
67using reverse_time_function = smallfun::function<TimeVal(const ossia::time_value&)>;
68
69struct ExecutionCommandQueue : private moodycamel::ReaderWriterQueue<ExecutionCommand>
70{
71public:
72 using ReaderWriterQueue<ExecutionCommand>::ReaderWriterQueue;
73 template <typename... Args>
74 inline auto enqueue(Args&&... args) -> decltype(auto)
75 {
76 OSSIA_ENSURE_CURRENT_THREAD(ossia::thread_type::Ui);
77 return ReaderWriterQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
78 }
79 template <typename... Args>
80 inline auto enqueue_bulk(Args&&... args) -> decltype(auto)
81 {
82 OSSIA_ENSURE_CURRENT_THREAD(ossia::thread_type::Ui);
83 return ReaderWriterQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
84 }
85 template <typename... Args>
86 inline auto try_enqueue(Args&&... args) -> decltype(auto)
87 {
88 OSSIA_ENSURE_CURRENT_THREAD(ossia::thread_type::Ui);
89 return ReaderWriterQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
90 }
91 template <typename... Args>
92 inline auto try_enqueue_bulk(Args&&... args) -> decltype(auto)
93 {
94 OSSIA_ENSURE_CURRENT_THREAD(ossia::thread_type::Ui);
95 return ReaderWriterQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
96 }
97
98 template <typename... Args>
99 inline auto try_dequeue(Args&&... args) -> decltype(auto)
100 {
101 OSSIA_ENSURE_CURRENT_THREAD(ossia::thread_type::Audio);
102 return ReaderWriterQueue<ExecutionCommand>::try_dequeue(std::forward<Args>(args)...);
103 }
104};
105
106struct EditionCommandQueue : private moodycamel::ConcurrentQueue<ExecutionCommand>
107{
108public:
109 using ConcurrentQueue<ExecutionCommand>::ConcurrentQueue;
110 template <typename... Args>
111 inline auto enqueue(Args&&... args) -> decltype(auto)
112 {
113 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
114 return ConcurrentQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
115 }
116 template <typename... Args>
117 inline auto enqueue_bulk(Args&&... args) -> decltype(auto)
118 {
119 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
120 return ConcurrentQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
121 }
122 template <typename... Args>
123 inline auto try_enqueue(Args&&... args) -> decltype(auto)
124 {
125 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
126 return ConcurrentQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
127 }
128 template <typename... Args>
129 inline auto try_enqueue_bulk(Args&&... args) -> decltype(auto)
130 {
131 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
132 return ConcurrentQueue<ExecutionCommand>::enqueue(std::forward<Args>(args)...);
133 }
134
135 template <typename... Args>
136 inline auto try_dequeue(Args&&... args) -> decltype(auto)
137 {
138 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Ui);
139 return ConcurrentQueue<ExecutionCommand>::try_dequeue(std::forward<Args>(args)...);
140 }
141 template <typename... Args>
142 inline auto try_dequeue_bulk(Args&&... args) -> decltype(auto)
143 {
144 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Ui);
145 return ConcurrentQueue<ExecutionCommand>::try_dequeue_bulk(
146 std::forward<Args>(args)...);
147 }
148};
149
150struct GCCommandQueue : private moodycamel::ConcurrentQueue<GCCommand>
151{
152public:
153 using ConcurrentQueue<GCCommand>::ConcurrentQueue;
154 template <typename... Args>
155 inline auto enqueue(Args&&... args) -> decltype(auto)
156 {
157 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
158 return ConcurrentQueue<GCCommand>::enqueue(std::forward<Args>(args)...);
159 }
160 template <typename... Args>
161 inline auto enqueue_bulk(Args&&... args) -> decltype(auto)
162 {
163 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
164 return ConcurrentQueue<GCCommand>::enqueue(std::forward<Args>(args)...);
165 }
166 template <typename... Args>
167 inline auto try_enqueue(Args&&... args) -> decltype(auto)
168 {
169 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
170 return ConcurrentQueue<GCCommand>::enqueue(std::forward<Args>(args)...);
171 }
172 template <typename... Args>
173 inline auto try_enqueue_bulk(Args&&... args) -> decltype(auto)
174 {
175 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Audio);
176 return ConcurrentQueue<GCCommand>::enqueue(std::forward<Args>(args)...);
177 }
178
179 template <typename... Args>
180 inline auto try_dequeue(Args&&... args) -> decltype(auto)
181 {
182 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Ui);
183 return ConcurrentQueue<GCCommand>::try_dequeue(std::forward<Args>(args)...);
184 }
185 template <typename... Args>
186 inline auto try_dequeue_bulk(Args&&... args) -> decltype(auto)
187 {
188 OSSIA_ENSURE_CURRENT_THREAD_KIND(ossia::thread_type::Ui);
189 return ConcurrentQueue<GCCommand>::try_dequeue_bulk(std::forward<Args>(args)...);
190 }
191};
192
195struct SCORE_LIB_PROCESS_EXPORT Context
196{
197 std::weak_ptr<void> alias;
198
199 auto acquireExecutionQueue() const noexcept
200 {
201 return std::shared_ptr<Execution::ExecutionCommandQueue>(
202 alias.lock(), &executionQueue);
203 }
204 auto acquireEditionQueue() const noexcept
205 {
206 return std::shared_ptr<Execution::EditionCommandQueue>(alias.lock(), &editionQueue);
207 }
208 auto acquireGCQueue() const noexcept
209 {
210 return std::shared_ptr<Execution::GCCommandQueue>(alias.lock(), &gcQueue);
211 }
212 std::weak_ptr<const Context> weakSelf() const noexcept
213 {
214 return std::shared_ptr<const Context>(alias.lock(), this);
215 }
216 std::weak_ptr<Execution::ExecutionCommandQueue> weakExecutionQueue() const noexcept
217 {
218 return std::shared_ptr<Execution::ExecutionCommandQueue>(
219 alias.lock(), &executionQueue);
220 }
221 std::weak_ptr<Execution::EditionCommandQueue> weakEditionQueue() const noexcept
222 {
223 return std::shared_ptr<Execution::EditionCommandQueue>(alias.lock(), &editionQueue);
224 }
225 std::weak_ptr<Execution::GCCommandQueue> weakGCQueue() const noexcept
226 {
227 return std::shared_ptr<Execution::GCCommandQueue>(alias.lock(), &gcQueue);
228 }
229
230 const score::DocumentContext& doc;
231 const std::atomic_bool& created;
232
239 Execution::reverse_time_function reverseTime;
240
243 EditionCommandQueue& editionQueue;
244 GCCommandQueue& gcQueue;
245 SetupContext& setup;
246
247 const std::shared_ptr<ossia::graph_interface>& execGraph;
248 const std::shared_ptr<ossia::execution_state>& execState;
249
250 auto& context() const { return *this; }
251
252#if !defined(_MSC_VER)
253#if __cplusplus > 201703L
254#pragma clang diagnostic push
255#pragma clang diagnostic ignored "-Wunknown-attributes"
256 [[no_unique_address]] ossia::disable_init_t disable_copy;
257#pragma clang diagnostic pop
258#else
259 Context() = delete;
260 Context(const Context&) = delete;
261 Context& operator=(const Context&) = delete;
262 Context(Context&&) = delete;
263 Context& operator=(Context&&) = delete;
264#endif
265#endif
266};
267
268}
269
270#define in_exec this->system().executionQueue.enqueue
271#define in_edit this->system().editionQueue.enqueue
272#define weak_exec this->system().weakExecutionQueue()
273#define weak_edit this->system().weakEditionQueue()
274#define weak_gc this->system().weakGCQueue()
Components used for the execution of a score.
Definition ProcessComponent.cpp:14
smallfun::function< ossia::time_value(const TimeVal &)> time_function
Sets-up and manages the main execution clock.
Definition ExecutionContext.hpp:66
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Utilities for OSSIA data structures.
Definition DeviceInterface.hpp:33
Base toolkit upon which the software is built.
Definition Application.cpp:99
Definition ExecutionContext.hpp:196
ExecutionCommandQueue & executionQueue
Definition ExecutionContext.hpp:242
Execution::time_function time
Definition ExecutionContext.hpp:238
Definition ExecutionContext.hpp:107
Definition ExecutionContext.hpp:70
Definition ExecutionContext.hpp:151
Definition ExecutionSetup.hpp:38
Definition TimeValue.hpp:21
Definition DocumentContext.hpp:18