Fix a datarace detected by thread sanitizer.

This commit is contained in:
Patrick Pelissier committed 2017-09-30 19:34:34 +02:00
1 parent 9202fb2fea
commit a0948ed11a
1 file changed
+12 -6
+12 -6
View File
@@ -74,13 +74,16 @@ typedef enum {
(((policy) & (val)) != 0)
#define BUFFERI_CONTRACT(buffer, size) do { \
assert (buffer != NULL); \
assert (buffer->data != NULL); \
assert (buffer->number <= BUFFERI_SIZE(size)); \
assert (buffer->idx_prod <= BUFFERI_SIZE(size)); \
assert (buffer->idx_cons <= BUFFERI_SIZE(size)); \
assert (buffer != NULL); \
assert (buffer->data != NULL); \
}while (0)
#define BUFFERI_PROTECTED_CONTRACT(buffer, size) do { \
assert (buffer->number <= BUFFERI_SIZE(size)); \
assert (buffer->idx_prod <= BUFFERI_SIZE(size)); \
assert (buffer->idx_cons <= BUFFERI_SIZE(size)); \
} while (0)
#define BUFFERI_DEF(arg) BUFFERI_DEF2 arg
#define BUFFERI_DEF2(name, type, m_size, policy, oplist, buffer_t) \
@@ -161,7 +164,8 @@ M_C(name, _init)(buffer_t v, size_t size) \
BUFFERI_CONTRACT(v,m_size); \
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) \
m_mutex_lock(v->mutex); \
if (BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) \
BUFFERI_PROTECTED_CONTRACT(v, m_size); \
if (BUFFERI_POLICY_P((policy), BUFFER_PUSH_INIT_POP_MOVE)) \
M_C(name, _int_clear_obj)(v); \
else \
v->idx_prod = v->idx_cons = v->number = 0; \
@@ -212,6 +216,7 @@ M_C(name, _init)(buffer_t v, size_t size) \
} else if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
&& M_C(name, _full_p)(v)) \
return false; \
BUFFERI_PROTECTED_CONTRACT(v, m_size); \
\
/* INDEX computation if we have to overwrite the last element */ \
if (M_UNLIKELY (BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
@@ -270,6 +275,7 @@ M_C(name, _init)(buffer_t v, size_t size) \
} \
} else if (M_C(name, _empty_p)(v)) \
return false; \
BUFFERI_PROTECTED_CONTRACT(v, m_size); \
\
/* POP data */ \
if (!BUFFERI_POLICY_P((policy), BUFFER_STACK)) { \