Code

Merge remote-tracking branch 'github/pr/387'
[collectd.git] / src / utils_heap.c
index 1ecd07e82abb8dd66ed787413c0b2d572192eb75..f8f7405870845ecab721762167173a06ffed8986 100644 (file)
@@ -96,7 +96,7 @@ static void reheap (c_heap_t *h, size_t root, enum reheap_direction dir)
     return;
 
   if (dir == DIR_UP)
-    reheap (h, root / 2, dir);
+    reheap (h, (root - 1) / 2, dir);
   else if (dir == DIR_DOWN)
     reheap (h, min, dir);
 } /* void reheap */
@@ -140,6 +140,8 @@ void c_heap_destroy (c_heap_t *h)
 
 int c_heap_insert (c_heap_t *h, void *ptr)
 {
+  size_t index;
+
   if ((h == NULL) || (ptr == NULL))
     return (-EINVAL);
 
@@ -162,17 +164,18 @@ int c_heap_insert (c_heap_t *h, void *ptr)
   }
 
   /* Insert the new node as a leaf. */
-  h->list[h->list_len] = ptr;
+  index = h->list_len;
+  h->list[index] = ptr;
   h->list_len++;
 
   /* Reorganize the heap from bottom up. */
-  reheap (h, /* parent of this node = */ (h->list_len - 1) / 2, DIR_UP);
+  reheap (h, /* parent of this node = */ (index - 1) / 2, DIR_UP);
   
   pthread_mutex_unlock (&h->lock);
   return (0);
 } /* int c_heap_insert */
 
-void *c_head_get_root (c_heap_t *h)
+void *c_heap_get_root (c_heap_t *h)
 {
   void *ret = NULL;
 
@@ -218,6 +221,6 @@ void *c_head_get_root (c_heap_t *h)
   pthread_mutex_unlock (&h->lock);
 
   return (ret);
-} /* void *c_head_get_root */
+} /* void *c_heap_get_root */
 
 /* vim: set sw=2 sts=2 et fdm=marker : */