in src/clds_hash_table.c [290:325]
void clds_hash_table_destroy(CLDS_HASH_TABLE_HANDLE clds_hash_table)
{
if (clds_hash_table == NULL)
{
/* Codes_SRS_CLDS_HASH_TABLE_01_007: [ If clds_hash_table is NULL, clds_hash_table_destroy shall return. ]*/
LogError("Invalid arguments: CLDS_HASH_TABLE_HANDLE clds_hash_table=%p", clds_hash_table);
}
else
{
int32_t i;
BUCKET_ARRAY* bucket_array = interlocked_compare_exchange_pointer((void* volatile_atomic*)&clds_hash_table->first_hash_table, NULL, NULL);
while (bucket_array != NULL)
{
BUCKET_ARRAY* next_bucket_array = interlocked_compare_exchange_pointer((void* volatile_atomic*)&bucket_array->next_bucket, NULL, NULL);
/* Codes_SRS_CLDS_HASH_TABLE_01_006: [ clds_hash_table_destroy shall free all resources associated with the hash table instance. ]*/
for (i = 0; i < bucket_array->bucket_count; i++)
{
if (bucket_array->hash_table[i] != NULL)
{
CLDS_SORTED_LIST_HANDLE linked_list = interlocked_compare_exchange_pointer((void* volatile_atomic*)&bucket_array->hash_table[i], NULL, NULL);
if (linked_list != NULL)
{
clds_sorted_list_destroy(linked_list);
}
}
}
free(bucket_array);
bucket_array = next_bucket_array;
}
free(clds_hash_table);
}
}