|
225 | 225 | #define CMD_TYPE(N) Command##N<T, M COMMA(N) COMMA_SEP_LIST(TYPE_ARG, N)> |
226 | 226 | #define CMD_ASSIGN_PARAM(N) cmd->p##N = p##N |
227 | 227 |
|
228 | | -#define DECL_PUSH(N) \ |
229 | | - template <class T, class M COMMA(N) COMMA_SEP_LIST(TYPE_PARAM, N)> \ |
230 | | - void push(T *p_instance, M p_method COMMA(N) COMMA_SEP_LIST(PARAM, N)) { \ |
231 | | - CMD_TYPE(N) *cmd = allocate_and_lock<CMD_TYPE(N)>(); \ |
232 | | - cmd->instance = p_instance; \ |
233 | | - cmd->method = p_method; \ |
234 | | - SEMIC_SEP_LIST(CMD_ASSIGN_PARAM, N); \ |
235 | | - unlock(); \ |
236 | | - if (sync) \ |
237 | | - sync->post(); \ |
| 228 | +#define DECL_PUSH(N) \ |
| 229 | + template <class T, class M COMMA(N) COMMA_SEP_LIST(TYPE_PARAM, N)> \ |
| 230 | + void push(T *p_instance, M p_method COMMA(N) COMMA_SEP_LIST(PARAM, N)) { \ |
| 231 | + if (unlikely(is_bypass_enabled_for_thread && is_bypass_enabled_for_thread())) { \ |
| 232 | + (p_instance->*p_method)(COMMA_SEP_LIST(ARG, N)); \ |
| 233 | + return; \ |
| 234 | + } \ |
| 235 | + CMD_TYPE(N) *cmd = allocate_and_lock<CMD_TYPE(N)>(); \ |
| 236 | + cmd->instance = p_instance; \ |
| 237 | + cmd->method = p_method; \ |
| 238 | + SEMIC_SEP_LIST(CMD_ASSIGN_PARAM, N); \ |
| 239 | + unlock(); \ |
| 240 | + if (sync) \ |
| 241 | + sync->post(); \ |
238 | 242 | } |
239 | 243 |
|
240 | 244 | #define CMD_RET_TYPE(N) CommandRet##N<T, M, COMMA_SEP_LIST(TYPE_ARG, N) COMMA(N) R> |
241 | 245 |
|
242 | 246 | #define DECL_PUSH_AND_RET(N) \ |
243 | 247 | template <class T, class M, COMMA_SEP_LIST(TYPE_PARAM, N) COMMA(N) class R> \ |
244 | 248 | void push_and_ret(T *p_instance, M p_method, COMMA_SEP_LIST(PARAM, N) COMMA(N) R *r_ret) { \ |
| 249 | + if (unlikely(is_bypass_enabled_for_thread && is_bypass_enabled_for_thread())) { \ |
| 250 | + *r_ret = (p_instance->*p_method)(COMMA_SEP_LIST(ARG, N)); \ |
| 251 | + return; \ |
| 252 | + } \ |
245 | 253 | SyncSemaphore *ss = _alloc_sync_sem(); \ |
246 | 254 | CMD_RET_TYPE(N) *cmd = allocate_and_lock<CMD_RET_TYPE(N)>(); \ |
247 | 255 | cmd->instance = p_instance; \ |
|
258 | 266 |
|
259 | 267 | #define CMD_SYNC_TYPE(N) CommandSync##N<T, M COMMA(N) COMMA_SEP_LIST(TYPE_ARG, N)> |
260 | 268 |
|
261 | | -#define DECL_PUSH_AND_SYNC(N) \ |
262 | | - template <class T, class M COMMA(N) COMMA_SEP_LIST(TYPE_PARAM, N)> \ |
263 | | - void push_and_sync(T *p_instance, M p_method COMMA(N) COMMA_SEP_LIST(PARAM, N)) { \ |
264 | | - SyncSemaphore *ss = _alloc_sync_sem(); \ |
265 | | - CMD_SYNC_TYPE(N) *cmd = allocate_and_lock<CMD_SYNC_TYPE(N)>(); \ |
266 | | - cmd->instance = p_instance; \ |
267 | | - cmd->method = p_method; \ |
268 | | - SEMIC_SEP_LIST(CMD_ASSIGN_PARAM, N); \ |
269 | | - cmd->sync_sem = ss; \ |
270 | | - unlock(); \ |
271 | | - if (sync) \ |
272 | | - sync->post(); \ |
273 | | - ss->sem.wait(); \ |
274 | | - ss->in_use = false; \ |
| 269 | +#define DECL_PUSH_AND_SYNC(N) \ |
| 270 | + template <class T, class M COMMA(N) COMMA_SEP_LIST(TYPE_PARAM, N)> \ |
| 271 | + void push_and_sync(T *p_instance, M p_method COMMA(N) COMMA_SEP_LIST(PARAM, N)) { \ |
| 272 | + if (unlikely(is_bypass_enabled_for_thread && is_bypass_enabled_for_thread())) { \ |
| 273 | + (p_instance->*p_method)(COMMA_SEP_LIST(ARG, N)); \ |
| 274 | + return; \ |
| 275 | + } \ |
| 276 | + SyncSemaphore *ss = _alloc_sync_sem(); \ |
| 277 | + CMD_SYNC_TYPE(N) *cmd = allocate_and_lock<CMD_SYNC_TYPE(N)>(); \ |
| 278 | + cmd->instance = p_instance; \ |
| 279 | + cmd->method = p_method; \ |
| 280 | + SEMIC_SEP_LIST(CMD_ASSIGN_PARAM, N); \ |
| 281 | + cmd->sync_sem = ss; \ |
| 282 | + unlock(); \ |
| 283 | + if (sync) \ |
| 284 | + sync->post(); \ |
| 285 | + ss->sem.wait(); \ |
| 286 | + ss->in_use = false; \ |
275 | 287 | } |
276 | 288 |
|
277 | 289 | #define MAX_CMD_PARAMS 13 |
@@ -322,6 +334,7 @@ class CommandQueueMT { |
322 | 334 | SyncSemaphore sync_sems[SYNC_SEMAPHORES]; |
323 | 335 | Mutex mutex; |
324 | 336 | Semaphore *sync; |
| 337 | + bool (*is_bypass_enabled_for_thread)(); |
325 | 338 |
|
326 | 339 | template <class T> |
327 | 340 | T *allocate() { |
@@ -487,7 +500,7 @@ class CommandQueueMT { |
487 | 500 | unlock(); |
488 | 501 | } |
489 | 502 |
|
490 | | - CommandQueueMT(bool p_sync); |
| 503 | + CommandQueueMT(bool p_sync, bool (*is_bypass_enabled_for_thread)() = nullptr); |
491 | 504 | ~CommandQueueMT(); |
492 | 505 | }; |
493 | 506 |
|
|
0 commit comments