Fix data race for buffer in POP_RELEASE mode.
This commit is contained in:
1 parent
83eeb5d6d0
commit
55332d61fd
1 file changed
+8
-3
+8
-3
@@ -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); \
|
||||
} \
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user