12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /*
- * heap_destroy.c
- */
- #include "private.h"
- #include "node.h"
- #include "context.h"
- /*--------------------------------------------------------- */
- static void
- _lub_heap_segment_remove(void *ptr, unsigned index, size_t size, void *arg)
- {
- lub_heap_segment_t *segment = ptr;
- lub_heap_leak_t *leak = lub_heap_leak_instance();
- /* remove segment from the leak tree */
- lub_bintree_remove(&leak->m_segment_tree, segment);
- lub_heap_leak_release(leak);
- }
- /*--------------------------------------------------------- */
- static void _lub_heap_node_remove(lub_heap_node_t * node, void *arg)
- {
- lub_heap_t *this = arg;
- lub_heap_context_t *context = lub_heap_node__get_context(node);
- lub_heap_leak_t *leak = lub_heap_leak_instance();
- if (context && (context->heap == this)) {
- --leak->m_stats.allocs;
- leak->m_stats.alloc_bytes -= lub_heap_node__get_size(node);
- /* remove this node from the leak tree */
- lub_heap_node_fini(node);
- }
- lub_heap_leak_release(leak);
- }
- /*--------------------------------------------------------- */
- void lub_heap_destroy(lub_heap_t * this)
- {
- lub_heap_leak_t *leak = lub_heap_leak_instance();
- lub_heap_t **ptr;
- for (ptr = &leak->m_heap_list; *ptr; ptr = &(*ptr)->next) {
- if ((*ptr) == this) {
- /* remove from the linked list */
- *ptr = this->next;
- break;
- }
- }
- lub_heap_leak_release(leak);
- /* remove all segments from the leak tree */
- lub_heap_foreach_segment(this, _lub_heap_segment_remove, 0);
- /* remove all nodes from the leak tree */
- lub_heap_foreach_node(_lub_heap_node_remove, this);
- }
- /*--------------------------------------------------------- */
|