Fix data race.

This commit is contained in:
Patrick Pelissier committed 2019-04-19 07:57:10 +02:00
1 parent 01ad221972
commit e6c958c0df
1 file changed
+5 -5
+5 -5
View File
@@ -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);
} }