3 * Copyright (C) Igor Sysoev
7 #include <ngx_config.h>
12 * find the middle queue element if the queue has odd number of elements
13 * or the first element of the queue's second part otherwise
17 ngx_queue_middle(ngx_queue_t *queue)
19 ngx_queue_t *middle, *next;
21 middle = ngx_queue_head(queue);
23 if (middle == ngx_queue_last(queue)) {
27 next = ngx_queue_head(queue);
30 middle = ngx_queue_next(middle);
32 next = ngx_queue_next(next);
34 if (next == ngx_queue_last(queue)) {
38 next = ngx_queue_next(next);
40 if (next == ngx_queue_last(queue)) {
47 /* the stable insertion sort */
50 ngx_queue_sort(ngx_queue_t *queue,
51 ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *))
53 ngx_queue_t *q, *prev, *next;
55 q = ngx_queue_head(queue);
57 if (q == ngx_queue_last(queue)) {
61 for (q = ngx_queue_next(q); q != ngx_queue_sentinel(queue); q = next) {
63 prev = ngx_queue_prev(q);
64 next = ngx_queue_next(q);
69 if (cmp(prev, q) <= 0) {
73 prev = ngx_queue_prev(prev);
75 } while (prev != ngx_queue_sentinel(queue));
77 ngx_queue_insert_after(prev, q);