Fix data race.
This commit is contained in:
1 parent
01ad221972
commit
e6c958c0df
1 file changed
+5
-5
+5
-5
@@ -123,7 +123,7 @@
|
|||||||
\
|
\
|
||||||
typedef struct M_C(name, _lf_node_s) { \
|
typedef struct M_C(name, _lf_node_s) { \
|
||||||
M_ATTR_EXTENSION _Atomic(struct M_C(name, _lf_node_s) *) next; \
|
M_ATTR_EXTENSION _Atomic(struct M_C(name, _lf_node_s) *) next; \
|
||||||
m_gc_ticket_t cpt; \
|
m_gc_atomic_ticket_t cpt; \
|
||||||
M_C(name, _slist_t) list; \
|
M_C(name, _slist_t) list; \
|
||||||
} M_C(name, _lf_node_t); \
|
} M_C(name, _lf_node_t); \
|
||||||
\
|
\
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
memory_order_relaxed); \
|
memory_order_relaxed); \
|
||||||
} else { \
|
} else { \
|
||||||
/* Test if the node is old enought to be popped */ \
|
/* Test if the node is old enought to be popped */ \
|
||||||
if (next->cpt >= age) \
|
if (atomic_load_explicit(&next->cpt, memory_order_relaxed) >= age) \
|
||||||
return NULL; \
|
return NULL; \
|
||||||
/* Try to swing Head to the next node */ \
|
/* Try to swing Head to the next node */ \
|
||||||
if (atomic_compare_exchange_strong_explicit(&list->head, \
|
if (atomic_compare_exchange_strong_explicit(&list->head, \
|
||||||
@@ -312,7 +312,7 @@
|
|||||||
return NULL; \
|
return NULL; \
|
||||||
} \
|
} \
|
||||||
atomic_init(&node->next, (M_C(name, _lf_node_t) *) 0); \
|
atomic_init(&node->next, (M_C(name, _lf_node_t) *) 0); \
|
||||||
node->cpt = 0UL; \
|
atomic_init(&node->cpt, 0UL); \
|
||||||
M_C(name, _slist_init)(node->list); \
|
M_C(name, _slist_init)(node->list); \
|
||||||
for(unsigned i = 0; i < initial; i++) { \
|
for(unsigned i = 0; i < initial; i++) { \
|
||||||
M_C(name, _slist_node_t) *n; \
|
M_C(name, _slist_node_t) *n; \
|
||||||
@@ -439,7 +439,7 @@
|
|||||||
} \
|
} \
|
||||||
assert(M_C(name, _slist_empty_p)(node->list)); \
|
assert(M_C(name, _slist_empty_p)(node->list)); \
|
||||||
M_C(name, _slist_move)(node->list, mempool->thread_data[id].to_be_reclaimed); \
|
M_C(name, _slist_move)(node->list, mempool->thread_data[id].to_be_reclaimed); \
|
||||||
node->cpt = ticket; \
|
atomic_store_explicit(&node->cpt, ticket, memory_order_relaxed); \
|
||||||
M_C(name, _lflist_push)(mempool->to_be_reclaimed, node, gc_mem->thread_data[id].bkoff); \
|
M_C(name, _lflist_push)(mempool->to_be_reclaimed, node, gc_mem->thread_data[id].bkoff); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@@ -726,7 +726,7 @@ m_vlapool_int_gc_on_sleep(m_gc_t gc_mem, m_gc_mempool_list_t *data,
|
|||||||
}
|
}
|
||||||
assert(m_vlapool_slist_empty_p(node->list));
|
assert(m_vlapool_slist_empty_p(node->list));
|
||||||
m_vlapool_slist_move(node->list, vlapool->thread_data[id].to_be_reclaimed);
|
m_vlapool_slist_move(node->list, vlapool->thread_data[id].to_be_reclaimed);
|
||||||
node->cpt = ticket;
|
atomic_store_explicit(&node->cpt, ticket, memory_order_relaxed);
|
||||||
m_vlapool_lflist_push(vlapool->to_be_reclaimed, node, gc_mem->thread_data[id].bkoff);
|
m_vlapool_lflist_push(vlapool->to_be_reclaimed, node, gc_mem->thread_data[id].bkoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user