-/*
- * mono-linked-list-set.h: A lock-free split ordered list.
+/**
+ * \file
+ * A lock-free split ordered list.
*
* Author:
* Rodrigo Kumpera (kumpera@gmail.com)
You must manually clean the hazard pointer table after using them.
*/
-void
+MONO_API void
mono_lls_init (MonoLinkedListSet *list, void (*free_node_func)(void *));
-gboolean
+MONO_API gboolean
mono_lls_find (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, uintptr_t key);
-gboolean
+MONO_API gboolean
mono_lls_insert (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLinkedListSetNode *value);
-gboolean
+MONO_API gboolean
mono_lls_remove (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLinkedListSetNode *value);
-gpointer
-get_hazardous_pointer_with_mask (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index);
+MONO_API gpointer
+mono_lls_get_hazardous_pointer_with_mask (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index);
static inline gboolean
mono_lls_filter_accept_all (gpointer elem)
restart__ = FALSE; \
MonoLinkedListSetNode **prev__ = &list__->head; \
mono_hazard_pointer_set (hp__, 2, prev__); \
- MonoLinkedListSetNode *cur__ = (MonoLinkedListSetNode *) get_hazardous_pointer_with_mask ((gpointer *) prev__, hp__, 1); \
+ MonoLinkedListSetNode *cur__ = (MonoLinkedListSetNode *) mono_lls_get_hazardous_pointer_with_mask ((gpointer *) prev__, hp__, 1); \
while (1) { \
if (!cur__) { \
break; \
} \
- MonoLinkedListSetNode *next__ = (MonoLinkedListSetNode *) get_hazardous_pointer_with_mask ((gpointer *) &cur__->next, hp__, 0); \
+ MonoLinkedListSetNode *next__ = (MonoLinkedListSetNode *) mono_lls_get_hazardous_pointer_with_mask ((gpointer *) &cur__->next, hp__, 0); \
uintptr_t ckey__ = cur__->key; \
mono_memory_read_barrier (); \
if (*prev__ != cur__) { \
mono_memory_write_barrier (); \
mono_hazard_pointer_clear (hp__, 1); \
if (list__->free_node_func) { \
- mono_thread_hazardous_free_or_queue (cur__, list__->free_node_func, HAZARD_FREE_NO_LOCK, HAZARD_FREE_ASYNC_CTX); \
+ mono_thread_hazardous_queue_free (cur__, list__->free_node_func); \
} \
} else { \
restart__ = TRUE; \