Fix a datarace detected by thread sanitizer.
This commit is contained in:
1 parent
9202fb2fea
commit
a0948ed11a
1 file changed
+12
-6
+12
-6
@@ -74,13 +74,16 @@ typedef enum {
|
|||||||
(((policy) & (val)) != 0)
|
(((policy) & (val)) != 0)
|
||||||
|
|
||||||
#define BUFFERI_CONTRACT(buffer, size) do { \
|
#define BUFFERI_CONTRACT(buffer, size) do { \
|
||||||
assert (buffer != NULL); \
|
assert (buffer != NULL); \
|
||||||
assert (buffer->data != 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)); \
|
|
||||||
}while (0)
|
}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_DEF(arg) BUFFERI_DEF2 arg
|
||||||
|
|
||||||
#define BUFFERI_DEF2(name, type, m_size, policy, oplist, buffer_t) \
|
#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); \
|
BUFFERI_CONTRACT(v,m_size); \
|
||||||
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) \
|
if (!BUFFERI_POLICY_P((policy), BUFFER_THREAD_UNSAFE)) \
|
||||||
m_mutex_lock(v->mutex); \
|
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); \
|
M_C(name, _int_clear_obj)(v); \
|
||||||
else \
|
else \
|
||||||
v->idx_prod = v->idx_cons = v->number = 0; \
|
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) \
|
} else if (!BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
|
||||||
&& M_C(name, _full_p)(v)) \
|
&& M_C(name, _full_p)(v)) \
|
||||||
return false; \
|
return false; \
|
||||||
|
BUFFERI_PROTECTED_CONTRACT(v, m_size); \
|
||||||
\
|
\
|
||||||
/* INDEX computation if we have to overwrite the last element */ \
|
/* INDEX computation if we have to overwrite the last element */ \
|
||||||
if (M_UNLIKELY (BUFFERI_POLICY_P((policy), BUFFER_PUSH_OVERWRITE) \
|
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)) \
|
} else if (M_C(name, _empty_p)(v)) \
|
||||||
return false; \
|
return false; \
|
||||||
|
BUFFERI_PROTECTED_CONTRACT(v, m_size); \
|
||||||
\
|
\
|
||||||
/* POP data */ \
|
/* POP data */ \
|
||||||
if (!BUFFERI_POLICY_P((policy), BUFFER_STACK)) { \
|
if (!BUFFERI_POLICY_P((policy), BUFFER_STACK)) { \
|
||||||
|
|||||||
Reference in new issue
Block a user