X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lib%2Fprio_heap%2Fprio_heap.h;h=2674db21fb8496d5e5a7ceacd5ad26ce1af756f6;hb=6074d5430effe9efb2a1c8486cabcfbcb8eafb63;hp=12b1638f9d46592584fb1f7a62829604fd94b1ca;hpb=162769efd7bca728713c4bf8e609fc408d58f512;p=lttng-modules.git diff --git a/lib/prio_heap/prio_heap.h b/lib/prio_heap/prio_heap.h index 12b1638f..2674db21 100644 --- a/lib/prio_heap/prio_heap.h +++ b/lib/prio_heap/prio_heap.h @@ -4,8 +4,7 @@ /* * prio_heap.h * - * Static-sized priority heap containing pointers. Based on CLRS, - * chapter 6. + * Priority heap containing pointers. Based on CLRS, chapter 6. * * Copyright 2011 - Mathieu Desnoyers * @@ -20,10 +19,14 @@ * all copies or substantial portions of the Software. */ -/* - * TODO: - * implement struct ptr_head, heap_init, heap_free, heap_insert. - */ +#include + +struct ptr_heap { + size_t len, alloc_len; + void **ptrs; + int (*gt)(void *a, void *b); + gfp_t gfpmask; +}; /** * heap_maximum - return the largest element in the heap @@ -34,9 +37,38 @@ */ static inline void *heap_maximum(const struct ptr_heap *heap) { - return heap->size ? heap->ptrs[0] : NULL; + return heap->len ? heap->ptrs[0] : NULL; } +/** + * heap_init - initialize the heap + * @heap: the heap to initialize + * @alloc_len: number of elements initially allocated + * @gfp: allocation flags + * @gt: function to compare the elements + * + * Returns -ENOMEM if out of memory. + */ +extern int heap_init(struct ptr_heap *heap, + size_t alloc_len, gfp_t gfpmask, + int gt(void *a, void *b)); + +/** + * heap_free - free the heap + * @heap: the heap to free + */ +extern void heap_free(struct ptr_heap *heap); + +/** + * heap_insert - insert an element into the heap + * @heap: the heap to be operated on + * @p: the element to add + * + * Insert an element into the heap. + * + * Returns -ENOMEM if out of memory. + */ +extern int heap_insert(struct ptr_heap *heap, void *p); /** * heap_remove - remove the largest element from the heap @@ -68,7 +100,7 @@ extern void *heap_cherrypick(struct ptr_heap *heap, void *p); * the heap is empty. * * This is the equivalent of calling heap_remove() and then heap_insert(), but - * it only rebalances the heap once. + * it only rebalances the heap once. It never allocates memory. */ extern void *heap_replace_max(struct ptr_heap *heap, void *p);