void clds_hazard_pointers_destroy()

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);
    }
}