trace2: use system/global config for default trace2 settings
[gitweb.git] / prio-queue.c
index 0f4fcf2755064e7299449f44d3687f2f6ca0d715..d3f488cb05f29bc90e4e03810d9bf4b972d0834f 100644 (file)
@@ -3,16 +3,16 @@
 
 static inline int compare(struct prio_queue *queue, int i, int j)
 {
-       int cmp = queue->compare(queue->array[i], queue->array[j],
+       int cmp = queue->compare(queue->array[i].data, queue->array[j].data,
                                 queue->cb_data);
+       if (!cmp)
+               cmp = queue->array[i].ctr - queue->array[j].ctr;
        return cmp;
 }
 
 static inline void swap(struct prio_queue *queue, int i, int j)
 {
-       void *tmp = queue->array[i];
-       queue->array[i] = queue->array[j];
-       queue->array[j] = tmp;
+       SWAP(queue->array[i], queue->array[j]);
 }
 
 void prio_queue_reverse(struct prio_queue *queue)
@@ -20,17 +20,17 @@ void prio_queue_reverse(struct prio_queue *queue)
        int i, j;
 
        if (queue->compare != NULL)
-               die("BUG: prio_queue_reverse() on non-LIFO queue");
-       for (i = 0; i <= (j = (queue->nr - 1) - i); i++)
+               BUG("prio_queue_reverse() on non-LIFO queue");
+       for (i = 0; i < (j = (queue->nr - 1) - i); i++)
                swap(queue, i, j);
 }
 
 void clear_prio_queue(struct prio_queue *queue)
 {
-       free(queue->array);
+       FREE_AND_NULL(queue->array);
        queue->nr = 0;
        queue->alloc = 0;
-       queue->array = NULL;
+       queue->insertion_ctr = 0;
 }
 
 void prio_queue_put(struct prio_queue *queue, void *thing)
@@ -39,7 +39,9 @@ void prio_queue_put(struct prio_queue *queue, void *thing)
 
        /* Append at the end */
        ALLOC_GROW(queue->array, queue->nr + 1, queue->alloc);
-       queue->array[queue->nr++] = thing;
+       queue->array[queue->nr].ctr = queue->insertion_ctr++;
+       queue->array[queue->nr].data = thing;
+       queue->nr++;
        if (!queue->compare)
                return; /* LIFO */
 
@@ -61,9 +63,9 @@ void *prio_queue_get(struct prio_queue *queue)
        if (!queue->nr)
                return NULL;
        if (!queue->compare)
-               return queue->array[--queue->nr]; /* LIFO */
+               return queue->array[--queue->nr].data; /* LIFO */
 
-       result = queue->array[0];
+       result = queue->array[0].data;
        if (!--queue->nr)
                return result;
 
@@ -83,3 +85,12 @@ void *prio_queue_get(struct prio_queue *queue)
        }
        return result;
 }
+
+void *prio_queue_peek(struct prio_queue *queue)
+{
+       if (!queue->nr)
+               return NULL;
+       if (!queue->compare)
+               return queue->array[queue->nr - 1].data;
+       return queue->array[0].data;
+}