/** \brief shutdown the flow engine * \warning Not thread safe */ void HostShutdown(void) { Host *h; uint32_t u; HostPrintStats(); /* free spare queue */ while((h = HostDequeue(&host_spare_q))) { BUG_ON(SC_ATOMIC_GET(h->use_cnt) > 0); HostFree(h); } /* clear and free the hash */ if (host_hash != NULL) { for (u = 0; u < host_config.hash_size; u++) { Host *h = host_hash[u].head; while (h) { Host *n = h->hnext; HostClearMemory(h); HostFree(h); h = n; } HRLOCK_DESTROY(&host_hash[u]); } SCFree(host_hash); host_hash = NULL; } (void) SC_ATOMIC_SUB(host_memuse, host_config.hash_size * sizeof(HostHashRow)); HostQueueDestroy(&host_spare_q); SC_ATOMIC_DESTROY(host_prune_idx); SC_ATOMIC_DESTROY(host_memuse); SC_ATOMIC_DESTROY(host_counter); //SC_ATOMIC_DESTROY(flow_flags); return; }
/** \brief shutdown the flow engine * \warning Not thread safe */ void IPPairShutdown(void) { IPPair *h; uint32_t u; IPPairPrintStats(); /* free spare queue */ while((h = IPPairDequeue(&ippair_spare_q))) { BUG_ON(SC_ATOMIC_GET(h->use_cnt) > 0); IPPairFree(h); } /* clear and free the hash */ if (ippair_hash != NULL) { for (u = 0; u < ippair_config.hash_size; u++) { h = ippair_hash[u].head; while (h) { IPPair *n = h->hnext; IPPairFree(h); h = n; } HRLOCK_DESTROY(&ippair_hash[u]); } SCFreeAligned(ippair_hash); ippair_hash = NULL; } (void) SC_ATOMIC_SUB(ippair_memuse, ippair_config.hash_size * sizeof(IPPairHashRow)); IPPairQueueDestroy(&ippair_spare_q); SC_ATOMIC_DESTROY(ippair_prune_idx); SC_ATOMIC_DESTROY(ippair_memuse); SC_ATOMIC_DESTROY(ippair_counter); SC_ATOMIC_DESTROY(ippair_config.memcap); //SC_ATOMIC_DESTROY(flow_flags); return; }