in src/clds_hazard_pointers.c [437:471]
CLDS_HAZARD_POINTERS_THREAD_HANDLE clds_hazard_pointers_register_thread(CLDS_HAZARD_POINTERS_HANDLE clds_hazard_pointers)
{
CLDS_HAZARD_POINTERS_THREAD_HANDLE clds_hazard_pointers_thread = malloc(sizeof(CLDS_HAZARD_POINTERS_THREAD));
if (clds_hazard_pointers_thread == NULL)
{
LogError("malloc failed");
}
else
{
bool restart_needed;
clds_hazard_pointers_thread->clds_hazard_pointers = clds_hazard_pointers;
do
{
CLDS_HAZARD_POINTERS_THREAD_HANDLE current_threads_head = interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers->head, NULL, NULL);
(void)interlocked_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers_thread->next, current_threads_head);
clds_hazard_pointers_thread->reclaim_list_entry_count = 0;
(void)interlocked_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers_thread->pointers, NULL);
(void)interlocked_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers_thread->free_pointers, NULL);
clds_hazard_pointers_thread->reclaim_list = NULL;
(void)interlocked_exchange(&clds_hazard_pointers_thread->active, 1);
if (interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers->head, clds_hazard_pointers_thread, current_threads_head) != current_threads_head)
{
restart_needed = true;
}
else
{
// done
restart_needed = false;
}
} while (restart_needed);
}
return clds_hazard_pointers_thread;
}