Fix data race for buffer in POP_RELEASE mode.

This commit is contained in:
Patrick Pelissier committed 2018-01-12 18:52:34 +01:00
1 parent 83eeb5d6d0
commit 55332d61fd
1 file changed
+8 -3
+8 -3
View File
@@ -285,9 +285,14 @@ M_C(name, _init)(buffer_t v, size_t size) \
} \
\
/* Increment number of elements of the buffer */ \
atomic_store (&v->number[0], atomic_load(&v->number[0]) + 1); \
if (BUFFERI_POLICY_P((policy), BUFFER_DEFERRED_POP)) \
if (BUFFERI_POLICY_P((policy), BUFFER_DEFERRED_POP)) { \
/* If DEFERRED POP, number[0] can be modify outside the mutex */ \
atomic_fetch_add (&v->number[0], 1); \
atomic_store (&v->number[1], atomic_load(&v->number[1]) + 1); \
} else { \
/* No need for atomic_add: all access are protected */ \
atomic_store (&v->number[0], atomic_load(&v->number[0]) + 1); \
} \
\
/* BUFFER unlock */ \
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) { \
@@ -387,7 +392,7 @@ M_C(name, _init)(buffer_t v, size_t size) \
{ \
/* Decrement the effective number of elements in the buffer */ \
if (BUFFERI_POLICY_P((policy), BUFFER_DEFERRED_POP)) \
atomic_store (&v->number[0], atomic_load(&v->number[0]) - 1); \
atomic_fetch_sub (&v->number[0], 1); \
} \