diff --git a/m-buffer.h b/m-buffer.h index 81e4f406..1d6578cf 100644 --- a/m-buffer.h +++ b/m-buffer.h @@ -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); \ } \