in src/clds_hazard_pointers.c [400:435]
void clds_hazard_pointers_destroy(CLDS_HAZARD_POINTERS_HANDLE clds_hazard_pointers)
{
if (clds_hazard_pointers == NULL)
{
LogError("Invalid arguments: CLDS_HAZARD_POINTERS_HANDLE clds_hazard_pointers=%p", clds_hazard_pointers);
}
else
{
worker_thread_close(clds_hazard_pointers->hp_thread_cleanup_worker);
worker_thread_destroy(clds_hazard_pointers->hp_thread_cleanup_worker);
CLDS_HAZARD_POINTERS_THREAD_HANDLE clds_hazard_pointers_thread = interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers->head, NULL, NULL);
while (clds_hazard_pointers_thread != NULL)
{
internal_reclaim(clds_hazard_pointers_thread);
clds_hazard_pointers_thread = interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers_thread->next, NULL, NULL);
}
// free all thread data here
clds_hazard_pointers_thread = interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers->head, NULL, NULL);
while (clds_hazard_pointers_thread != NULL)
{
CLDS_HAZARD_POINTERS_THREAD_HANDLE next_clds_hazard_pointers_thread = interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hazard_pointers_thread->next, NULL, NULL);
free_thread_data(clds_hazard_pointers_thread);
clds_hazard_pointers_thread = next_clds_hazard_pointers_thread;
}
// free all inactive threads
free_inactive_threads_in_previous_epochs(clds_hazard_pointers, INT64_MAX);
TQUEUE_ASSIGN(CLDS_HP_INACTIVE_THREAD)(&clds_hazard_pointers->inactive_threads, NULL);
free(clds_hazard_pointers);
}
}