summaryrefslogtreecommitdiff
path: root/user/nginx/merge-sort.patch
diff options
context:
space:
mode:
Diffstat (limited to 'user/nginx/merge-sort.patch')
-rw-r--r--user/nginx/merge-sort.patch101
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
+
+