changeset 7302:8e65f6755843 HEAD

Fixed removing last item from priority queue.
author Timo Sirainen <tss@iki.fi>
date Fri, 29 Feb 2008 03:31:06 +0200
parents c75b2e1fa5a2
children db4a29902723
files src/lib/priorityq.c
diffstat 1 files changed, 5 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/priorityq.c	Thu Feb 28 06:29:43 2008 +0200
+++ b/src/lib/priorityq.c	Fri Feb 29 03:31:06 2008 +0200
@@ -66,11 +66,13 @@
 heap_item_bubble_up(struct priorityq *pq, unsigned int idx)
 {
 	struct priorityq_item **items;
-	unsigned int parent_idx;
+	unsigned int parent_idx, count;
 
-	items = array_idx_modifiable(&pq->items, 0);
+	items = array_get_modifiable(&pq->items, &count);
 	while (idx > 0) {
 		parent_idx = PARENT_IDX(idx);
+
+		i_assert(idx < count);
 		if (pq->cmp_callback(items[idx], items[parent_idx]) >= 0)
 			break;
 
@@ -124,7 +126,7 @@
 	heap_items_swap(items, idx, count);
 	array_delete(&pq->items, count, 1);
 
-	if (count > 0) {
+	if (count > 0 && idx != count) {
 		if (idx > 0)
 			idx = heap_item_bubble_up(pq, idx);
 		heap_item_bubble_down(pq, idx);