struct _MonoLockFreeAllocDescriptor {
MonoLockFreeQueueNode node;
MonoLockFreeAllocator *heap;
- Anchor anchor;
+ volatile Anchor anchor;
unsigned int slot_size;
unsigned int max_count;
gpointer sb;
#ifndef DESC_AVAIL_DUMMY
- Descriptor *next;
+ Descriptor * volatile next;
#endif
- gboolean in_use;
+ gboolean in_use; /* used for debugging only */
};
#define NUM_DESC_BATCH 64
g_assert (desc->in_use);
desc->in_use = FALSE;
free_sb (desc->sb);
- mono_thread_hazardous_free_or_queue (desc, desc_enqueue_avail);
+ mono_thread_hazardous_free_or_queue (desc, desc_enqueue_avail, FALSE, TRUE);
}
#else
MonoLockFreeQueue available_descs;
list_put_partial (Descriptor *desc)
{
g_assert (desc->anchor.data.state != STATE_FULL);
- mono_thread_hazardous_free_or_queue (desc, desc_put_partial);
+ mono_thread_hazardous_free_or_queue (desc, desc_put_partial, FALSE, TRUE);
}
static void
desc_retire (desc);
} else {
g_assert (desc->heap->sc == sc);
- mono_thread_hazardous_free_or_queue (desc, desc_put_partial);
+ mono_thread_hazardous_free_or_queue (desc, desc_put_partial, FALSE, TRUE);
if (++num_non_empty >= 2)
return;
}