summaryrefslogtreecommitdiff
path: root/mysys/queues.c
diff options
context:
space:
mode:
Diffstat (limited to 'mysys/queues.c')
-rw-r--r--mysys/queues.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/mysys/queues.c b/mysys/queues.c
index 40aa3c8db53..1c7a1a4a618 100644
--- a/mysys/queues.c
+++ b/mysys/queues.c
@@ -25,7 +25,7 @@
#include <queues.h>
- /* The actuall code for handling queues */
+/* Init queue */
int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
pbool max_at_top, int (*compare) (void *, byte *, byte *),
@@ -44,6 +44,12 @@ int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
DBUG_RETURN(0);
}
+/*
+ Reinitialize queue for new usage; Note that you can't currently resize
+ the number of elements! If you need this, fix it :)
+*/
+
+
int reinit_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
pbool max_at_top, int (*compare) (void *, byte *, byte *),
void *first_cmp_arg)
@@ -78,6 +84,7 @@ void delete_queue(QUEUE *queue)
void queue_insert(register QUEUE *queue, byte *element)
{
reg2 uint idx,next;
+ int cmp;
#ifndef DBUG_OFF
if (queue->elements < queue->max_elements)
@@ -86,10 +93,12 @@ void queue_insert(register QUEUE *queue, byte *element)
queue->root[0]=element;
idx= ++queue->elements;
- while ((queue->compare(queue->first_cmp_arg,
- element+queue->offset_to_key,
- queue->root[(next=idx >> 1)]+queue->offset_to_key)
- ^ queue->max_at_top) < 0)
+ /* max_at_top swaps the comparison if we want to order by desc */
+ while ((cmp=queue->compare(queue->first_cmp_arg,
+ element+queue->offset_to_key,
+ queue->root[(next=idx >> 1)] +
+ queue->offset_to_key)) &&
+ (cmp ^ queue->max_at_top) < 0)
{
queue->root[idx]=queue->root[next];
idx=next;