diff options
Diffstat (limited to 'user/nginx/merge-sort.patch')
-rw-r--r-- | user/nginx/merge-sort.patch | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/user/nginx/merge-sort.patch b/user/nginx/merge-sort.patch new file mode 100644 index 000000000..cedd87925 --- /dev/null +++ b/user/nginx/merge-sort.patch @@ -0,0 +1,101 @@ +Source: https://trac.nginx.org/nginx/changeset/3038bd4d78169a5e8a2624d79cf76f45f0805ddc/nginx + +This patch was modified from upstream in the following way(s): + +* Update path so that the patch applies correctly +* dos2unix + +Index: src/core/ngx_queue.c +=================================================================== +--- a/src/core/ngx_queue.c (revision 4412) ++++ b/src/core/ngx_queue.c (revision 9167) +@@ -8,4 +8,8 @@ + #include <ngx_config.h> + #include <ngx_core.h> ++ ++ ++static void ngx_queue_merge(ngx_queue_t *queue, ngx_queue_t *tail, ++ ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)); + + +@@ -46,5 +50,5 @@ + + +-/* the stable insertion sort */ ++/* the stable merge sort */ + + void +@@ -52,5 +56,5 @@ + ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) + { +- ngx_queue_t *q, *prev, *next; ++ ngx_queue_t *q, tail; + + q = ngx_queue_head(queue); +@@ -60,21 +64,43 @@ + } + +- for (q = ngx_queue_next(q); q != ngx_queue_sentinel(queue); q = next) { ++ q = ngx_queue_middle(queue); + +- prev = ngx_queue_prev(q); +- next = ngx_queue_next(q); ++ ngx_queue_split(queue, q, &tail); + +- ngx_queue_remove(q); ++ ngx_queue_sort(queue, cmp); ++ ngx_queue_sort(&tail, cmp); + +- do { +- if (cmp(prev, q) <= 0) { +- break; +- } ++ ngx_queue_merge(queue, &tail, cmp); ++} + +- prev = ngx_queue_prev(prev); + +- } while (prev != ngx_queue_sentinel(queue)); ++static void ++ngx_queue_merge(ngx_queue_t *queue, ngx_queue_t *tail, ++ ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) ++{ ++ ngx_queue_t *q1, *q2; + +- ngx_queue_insert_after(prev, q); ++ q1 = ngx_queue_head(queue); ++ q2 = ngx_queue_head(tail); ++ ++ for ( ;; ) { ++ if (q1 == ngx_queue_sentinel(queue)) { ++ ngx_queue_add(queue, tail); ++ break; ++ } ++ ++ if (q2 == ngx_queue_sentinel(tail)) { ++ break; ++ } ++ ++ if (cmp(q1, q2) <= 0) { ++ q1 = ngx_queue_next(q1); ++ continue; ++ } ++ ++ ngx_queue_remove(q2); ++ ngx_queue_insert_before(q1, q2); ++ ++ q2 = ngx_queue_head(tail); + } + } +Index: src/core/ngx_queue.h +=================================================================== +--- a/src/core/ngx_queue.h (revision 4412) ++++ b/src/core/ngx_queue.h (revision 9167) +@@ -46,4 +46,7 @@ + (x)->next = h; \ + (h)->prev = x ++ ++ ++#define ngx_queue_insert_before ngx_queue_insert_tail + + |