mirror of
				https://github.com/openresty/openresty.git
				synced 2024-10-13 00:29:41 +00:00 
			
		
		
		
	updated the slab_defrag patch (for nginx) with better comments. thanks Shuxin for the suggestions.
This commit is contained in:
		@ -1,6 +1,6 @@
 | 
			
		||||
diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
--- a/src/core/ngx_slab.c	Tue Feb 18 17:30:40 2014 +0400
 | 
			
		||||
+++ b/src/core/ngx_slab.c	Tue May 06 14:00:13 2014 -0700
 | 
			
		||||
diff -r 48c97d83ab7f src/core/ngx_slab.c
 | 
			
		||||
--- a/src/core/ngx_slab.c	Tue Apr 29 22:22:38 2014 +0200
 | 
			
		||||
+++ b/src/core/ngx_slab.c	Tue May 06 16:22:20 2014 -0700
 | 
			
		||||
@@ -118,6 +118,7 @@
 | 
			
		||||
     pool->pages->slab = pages;
 | 
			
		||||
     pool->pages->next = &pool->free;
 | 
			
		||||
@ -9,7 +9,7 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
 
 | 
			
		||||
     pool->start = (u_char *)
 | 
			
		||||
                   ngx_align_ptr((uintptr_t) p + pages * sizeof(ngx_slab_page_t),
 | 
			
		||||
@@ -628,6 +629,7 @@
 | 
			
		||||
@@ -629,6 +630,7 @@
 | 
			
		||||
                 page[pages].slab = page->slab - pages;
 | 
			
		||||
                 page[pages].next = page->next;
 | 
			
		||||
                 page[pages].prev = page->prev;
 | 
			
		||||
@ -17,7 +17,7 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
 
 | 
			
		||||
                 p = (ngx_slab_page_t *) page->prev;
 | 
			
		||||
                 p->next = &page[pages];
 | 
			
		||||
@@ -651,6 +653,7 @@
 | 
			
		||||
@@ -652,6 +654,7 @@
 | 
			
		||||
                 p->slab = NGX_SLAB_PAGE_BUSY;
 | 
			
		||||
                 p->next = NULL;
 | 
			
		||||
                 p->prev = NGX_SLAB_PAGE;
 | 
			
		||||
@ -25,7 +25,7 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
                 p++;
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
@@ -668,7 +671,7 @@
 | 
			
		||||
@@ -672,7 +675,7 @@
 | 
			
		||||
 ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page,
 | 
			
		||||
     ngx_uint_t pages)
 | 
			
		||||
 {
 | 
			
		||||
@ -34,11 +34,11 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
 
 | 
			
		||||
     page->slab = pages--;
 | 
			
		||||
 
 | 
			
		||||
@@ -682,6 +685,53 @@
 | 
			
		||||
@@ -686,6 +689,51 @@
 | 
			
		||||
         page->next->prev = page->prev;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    /* try to merge the following free block (if any) */
 | 
			
		||||
+    /* merge the next adjacent free block if it is free */
 | 
			
		||||
+
 | 
			
		||||
+    p = &page[page->slab];
 | 
			
		||||
+    if ((u_char *) p < pool->start
 | 
			
		||||
@ -48,7 +48,7 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
+    {
 | 
			
		||||
+        page->slab += p->slab;
 | 
			
		||||
+
 | 
			
		||||
+        /* remove the following block from the free list */
 | 
			
		||||
+        /* remove the next adjacent block from the free list */
 | 
			
		||||
+
 | 
			
		||||
+        prev = (ngx_slab_page_t *) p->prev;
 | 
			
		||||
+        prev->next = p->next;
 | 
			
		||||
@ -56,15 +56,14 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
+
 | 
			
		||||
+        ngx_memzero(p, sizeof(ngx_slab_page_t));
 | 
			
		||||
+
 | 
			
		||||
+        /* adjust prev_slab in the new following block accordingly */
 | 
			
		||||
+
 | 
			
		||||
+        /* adjust the "prev_slab" field in the next next adjacent block */
 | 
			
		||||
+        if ((u_char *) (p + p->slab) < pool->start) {
 | 
			
		||||
+            p[p->slab].prev_slab = page->slab;
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    if (page->prev_slab) {
 | 
			
		||||
+        /* try to merge the preceding free block (if any) */
 | 
			
		||||
+        /* merge the previous adjacent block if it is free */
 | 
			
		||||
+
 | 
			
		||||
+        p = page - page->prev_slab;
 | 
			
		||||
+        if (!(p->slab & NGX_SLAB_PAGE_START)
 | 
			
		||||
@ -74,8 +73,7 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
+            p->slab += page->slab;
 | 
			
		||||
+            ngx_memzero(page, sizeof(ngx_slab_page_t));
 | 
			
		||||
+
 | 
			
		||||
+            /* adjust prev_slab in the following block accordingly */
 | 
			
		||||
+
 | 
			
		||||
+            /* adjust the "prev_slab" field in the next adjacent block */
 | 
			
		||||
+            if ((u_char *) (p + p->slab) < pool->start) {
 | 
			
		||||
+                p[p->slab].prev_slab = p->slab;
 | 
			
		||||
+            }
 | 
			
		||||
@ -88,14 +86,15 @@ diff -r 7586e7b2dbe9 src/core/ngx_slab.c
 | 
			
		||||
     page->prev = (uintptr_t) &pool->free;
 | 
			
		||||
     page->next = pool->free.next;
 | 
			
		||||
 
 | 
			
		||||
diff -r 7586e7b2dbe9 src/core/ngx_slab.h
 | 
			
		||||
--- a/src/core/ngx_slab.h	Tue Feb 18 17:30:40 2014 +0400
 | 
			
		||||
+++ b/src/core/ngx_slab.h	Tue May 06 14:00:13 2014 -0700
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
diff -r 48c97d83ab7f src/core/ngx_slab.h
 | 
			
		||||
--- a/src/core/ngx_slab.h	Tue Apr 29 22:22:38 2014 +0200
 | 
			
		||||
+++ b/src/core/ngx_slab.h	Tue May 06 16:22:20 2014 -0700
 | 
			
		||||
@@ -19,6 +19,8 @@
 | 
			
		||||
     uintptr_t         slab;
 | 
			
		||||
     ngx_slab_page_t  *next;
 | 
			
		||||
     uintptr_t         prev;
 | 
			
		||||
+    uintptr_t         prev_slab;
 | 
			
		||||
+                         /* number of pages for the previous adjacent block */
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user