From c8f2c0e06e93465ffa5884f9a57e47ddb7cd2b5a Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Thu, 11 Jul 2019 13:38:40 +0200 Subject: [PATCH] Add _push_move method for SPSC --- m-buffer.h | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/m-buffer.h b/m-buffer.h index 98fc4269..051c581c 100644 --- a/m-buffer.h +++ b/m-buffer.h @@ -770,7 +770,7 @@ M_C(name, _init)(buffer_t v, size_t size) \ -/* Definition of a a QUEUE for Single Produccer / Single Consummer +/* Definition of a a QUEUE for Single Producer / Single Consummer for high bandwidth scenario: * wait-free, * quite fast @@ -834,6 +834,27 @@ M_C(name, _init)(buffer_t v, size_t size) \ } \ \ static inline bool \ + M_C(name, _push_move)(buffer_t table, type x) \ + { \ + QUEUEI_SPSC_CONTRACT(table); \ + unsigned int r = atomic_load_explicit(&table->consoIdx, \ + memory_order_relaxed); \ + unsigned int w = atomic_load_explicit(&table->prodIdx, \ + memory_order_acquire); \ + if (w-r >= table->size) \ + return false; \ + unsigned int i = w & (table->size -1); \ + if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \ + M_DO_MOVE(oplist, table->Tab[i].x, x); \ + } else { \ + M_DO_INIT_MOVE(oplist, table->Tab[i].x, x); \ + } \ + atomic_store_explicit(&table->prodIdx, w+1, memory_order_release); \ + QUEUEI_SPSC_CONTRACT(table); \ + return true; \ + } \ + \ + static inline bool \ M_C(name, _pop)(type *ptr, buffer_t table) \ { \ QUEUEI_SPSC_CONTRACT(table); \