void *bt_heap_remove(struct ptr_heap *heap) { switch (heap->len) { case 0: return NULL; case 1: (void) heap_set_len(heap, 0); return heap->ptrs[0]; } /* Shrink, replace the current max by previous last entry and heapify */ heap_set_len(heap, heap->len - 1); /* len changed. previous last entry is at heap->len */ return bt_heap_replace_max(heap, heap->ptrs[heap->len]); }
void *bt_heap_cherrypick(struct ptr_heap *heap, void *p) { size_t pos, len = heap->len; for (pos = 0; pos < len; pos++) if (unlikely(heap->ptrs[pos] == p)) goto found; return NULL; found: if (unlikely(heap->len == 1)) { (void) heap_set_len(heap, 0); check_heap(heap); return heap->ptrs[0]; } /* Replace p with previous last entry and heapify. */ heap_set_len(heap, heap->len - 1); /* len changed. previous last entry is at heap->len */ heap->ptrs[pos] = heap->ptrs[heap->len]; heapify(heap, pos); return p; }
int bt_heap_copy(struct ptr_heap *dst, struct ptr_heap *src) { int ret; ret = bt_heap_init(dst, src->alloc_len, src->gt); if (ret < 0) goto end; ret = heap_set_len(dst, src->len); if (ret < 0) goto end; memcpy(dst->ptrs, src->ptrs, src->len * sizeof(void *)); end: return ret; }
void *bt_heap_replace_max(struct ptr_heap *heap, void *p) { void *res; if (unlikely(!heap->len)) { (void) heap_set_len(heap, 1); heap->ptrs[0] = p; check_heap(heap); return NULL; } /* Replace the current max and heapify */ res = heap->ptrs[0]; heap->ptrs[0] = p; heapify(heap, 0); return res; }
void *lttng_heap_replace_max(struct lttng_ptr_heap *heap, void *p) { void *res; if (!heap->len) { (void) heap_set_len(heap, 1); heap->ptrs[0] = p; lttng_check_heap(heap); return NULL; } /* Replace the current max and heapify */ res = heap->ptrs[0]; heap->ptrs[0] = p; heapify(heap, 0); return res; }
int bt_heap_insert(struct ptr_heap *heap, void *p) { void **ptrs; size_t pos; int ret; ret = heap_set_len(heap, heap->len + 1); if (unlikely(ret)) return ret; ptrs = heap->ptrs; pos = heap->len - 1; while (pos > 0 && heap->gt(p, ptrs[parent(pos)])) { /* Move parent down until we find the right spot */ ptrs[pos] = ptrs[parent(pos)]; pos = parent(pos); } ptrs[pos] = p; check_heap(heap); return 0; }