Add policy INIT_MOVE for queue MPMC.
This commit is contained in:
1 parent
8914d336a0
commit
aaa8efb6e3
1 file changed
+32
-13
+32
-13
@@ -311,9 +311,6 @@ M_C(name, _init)(buffer_t v, size_t size) \
|
|||||||
return v->overwrite; \
|
return v->overwrite; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
//TODO: datarace between BUFFER_CONTRACT which checks some protected
|
|
||||||
// variables and the heart of the function which use them protected...
|
|
||||||
|
|
||||||
/* Definition of a a QUEUE for Many Produccer / Many Consummer
|
/* Definition of a a QUEUE for Many Produccer / Many Consummer
|
||||||
for high bandwidth scenario:
|
for high bandwidth scenario:
|
||||||
* lock-free,
|
* lock-free,
|
||||||
@@ -361,9 +358,13 @@ M_C(name, _init)(buffer_t v, size_t size) \
|
|||||||
/* Thread has been preemptted by another one. */ \
|
/* Thread has been preemptted by another one. */ \
|
||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
M_GET_SET oplist (table->Tab[i].x, x); \
|
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||||
atomic_store(&table->Tab[i].seq, 2*idx); \
|
M_GET_SET oplist (table->Tab[i].x, x); \
|
||||||
return true; \
|
} else { \
|
||||||
|
M_GET_INIT_SET oplist (table->Tab[i].x, x); \
|
||||||
|
} \
|
||||||
|
atomic_store(&table->Tab[i].seq, 2*idx); \
|
||||||
|
return true; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline bool \
|
static inline bool \
|
||||||
@@ -380,9 +381,13 @@ M_C(name, _init)(buffer_t v, size_t size) \
|
|||||||
/* Thread has been preempted by another one */ \
|
/* Thread has been preempted by another one */ \
|
||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
|
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||||
M_GET_SET oplist (*ptr , table->Tab[i].x); \
|
M_GET_SET oplist (*ptr , table->Tab[i].x); \
|
||||||
atomic_store(&table->Tab[i].seq, 2*iC + 1); \
|
} else { \
|
||||||
return true; \
|
M_DO_MOVE (oplist, *ptr, table->Tab[i].x); \
|
||||||
|
} \
|
||||||
|
atomic_store(&table->Tab[i].seq, 2*iC + 1); \
|
||||||
|
return true; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
@@ -402,16 +407,31 @@ M_C(name, _init)(buffer_t v, size_t size) \
|
|||||||
} \
|
} \
|
||||||
for(unsigned int j = 0; j < size; j++) { \
|
for(unsigned int j = 0; j < size; j++) { \
|
||||||
atomic_init(&buffer->Tab[j].seq, 2*j+1); \
|
atomic_init(&buffer->Tab[j].seq, 2*j+1); \
|
||||||
M_GET_INIT oplist (buffer->Tab[j].x); \
|
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||||
|
M_GET_INIT oplist (buffer->Tab[j].x); \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name, _clear)(buffer_t buffer) \
|
M_C(name, _clear)(buffer_t buffer) \
|
||||||
{ \
|
{ \
|
||||||
for(unsigned int j = 0; j < buffer->size; j++) { \
|
if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) { \
|
||||||
M_GET_CLEAR oplist (buffer->Tab[j].x); \
|
for(unsigned int j = 0; j < buffer->size; j++) { \
|
||||||
} \
|
M_GET_CLEAR oplist (buffer->Tab[j].x); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
unsigned long long iP = atomic_load(&buffer->ProdIdx); \
|
||||||
|
unsigned int i = iP & (buffer->size -1); \
|
||||||
|
unsigned long long iC = atomic_load(&buffer->ConsoIdx); \
|
||||||
|
unsigned int j = iC & (buffer->size -1); \
|
||||||
|
while (i != j) { \
|
||||||
|
M_GET_CLEAR oplist(buffer->Tab[j].x); \
|
||||||
|
j++; \
|
||||||
|
if (j >= buffer->size) \
|
||||||
|
j = 0; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
M_GET_FREE oplist (buffer->Tab); \
|
M_GET_FREE oplist (buffer->Tab); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@@ -439,7 +459,6 @@ M_C(name, _init)(buffer_t v, size_t size) \
|
|||||||
return M_C(name, _size)(v) == v->size; \
|
return M_C(name, _size)(v) == v->size; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
// TODO: INIT_MOVE policy to support
|
|
||||||
|
|
||||||
|
|
||||||
// NOTE: SET & INIT_SET are deliberatly missing. TBC if it the right way.
|
// NOTE: SET & INIT_SET are deliberatly missing. TBC if it the right way.
|
||||||
|
|||||||
Reference in new issue
Block a user