|  | #ifndef PRIO_QUEUE_H | 
|  | #define PRIO_QUEUE_H | 
|  |  | 
|  | /* | 
|  | * A priority queue implementation, primarily for keeping track of | 
|  | * commits in the 'date-order' so that we process them from new to old | 
|  | * as they are discovered, but can be used to hold any pointer to | 
|  | * struct.  The caller is responsible for supplying a function to | 
|  | * compare two "things". | 
|  | * | 
|  | * Alternatively, this data structure can also be used as a LIFO stack | 
|  | * by specifying NULL as the comparison function. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Compare two "things", one and two; the third parameter is cb_data | 
|  | * in the prio_queue structure.  The result is returned as a sign of | 
|  | * the return value, being the same as the sign of the result of | 
|  | * subtracting "two" from "one" (i.e. negative if "one" sorts earlier | 
|  | * than "two"). | 
|  | */ | 
|  | typedef int (*prio_queue_compare_fn)(const void *one, const void *two, void *cb_data); | 
|  |  | 
|  | struct prio_queue_entry { | 
|  | unsigned ctr; | 
|  | void *data; | 
|  | }; | 
|  |  | 
|  | struct prio_queue { | 
|  | prio_queue_compare_fn compare; | 
|  | unsigned insertion_ctr; | 
|  | void *cb_data; | 
|  | int alloc, nr; | 
|  | struct prio_queue_entry *array; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Add the "thing" to the queue. | 
|  | */ | 
|  | void prio_queue_put(struct prio_queue *, void *thing); | 
|  |  | 
|  | /* | 
|  | * Extract the "thing" that compares the smallest out of the queue, | 
|  | * or NULL.  If compare function is NULL, the queue acts as a LIFO | 
|  | * stack. | 
|  | */ | 
|  | void *prio_queue_get(struct prio_queue *); | 
|  |  | 
|  | /* | 
|  | * Gain access to the "thing" that would be returned by | 
|  | * prio_queue_get, but do not remove it from the queue. | 
|  | */ | 
|  | void *prio_queue_peek(struct prio_queue *); | 
|  |  | 
|  | void clear_prio_queue(struct prio_queue *); | 
|  |  | 
|  | /* Reverse the LIFO elements */ | 
|  | void prio_queue_reverse(struct prio_queue *); | 
|  |  | 
|  | #endif /* PRIO_QUEUE_H */ |