]> git.kaiwu.me - nginx.git/commitdiff
*) add ngx_palloc_aligned() to allocate explicitlty aligned memory
authorIgor Sysoev <igor@sysoev.ru>
Tue, 27 May 2008 09:37:40 +0000 (09:37 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Tue, 27 May 2008 09:37:40 +0000 (09:37 +0000)
*) allows non-aligned memory blocks for small allocations and for odd
   length strings on all platforms
*) use ngx_palloc_aligned()

src/core/ngx_palloc.c
src/core/ngx_palloc.h
src/core/ngx_regex.c
src/http/ngx_http.c

index 4cf7e8a4bc6f527c29f79318518cb92f877d4985..130c67056aeaf6302f5b26dfde2bc84f67c10be7 100644 (file)
@@ -99,8 +99,6 @@ ngx_palloc(ngx_pool_t *pool, size_t size)
 
         for ( ;; ) {
 
-#if (NGX_HAVE_NONALIGNED)
-
             /*
              * allow non-aligned memory blocks for small allocations (1, 2,
              * or 3 bytes) and for odd length strings (struct's have aligned
@@ -110,10 +108,7 @@ ngx_palloc(ngx_pool_t *pool, size_t size)
             if (size < sizeof(int) || (size & 1)) {
                 m = p->last;
 
-            } else
-#endif
-
-            {
+            } else {
                 m = ngx_align_ptr(p->last, NGX_ALIGNMENT);
             }
 
@@ -177,6 +172,17 @@ ngx_palloc(ngx_pool_t *pool, size_t size)
 }
 
 
+void *
+ngx_palloc_aligned(ngx_pool_t *pool, size_t size)
+{
+    if (size & 1) {
+        size++;
+    }
+
+    return ngx_palloc(pool, size);
+}
+
+
 ngx_int_t
 ngx_pfree(ngx_pool_t *pool, void *p)
 {
index 13443d7dd82df89d8ead9d2983a0add83b35b87f..11e2b41da1013e2b7ebd07137f2ce5c828855f9d 100644 (file)
@@ -69,6 +69,7 @@ ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);
 void ngx_destroy_pool(ngx_pool_t *pool);
 
 void *ngx_palloc(ngx_pool_t *pool, size_t size);
+void *ngx_palloc_aligned(ngx_pool_t *pool, size_t size);
 void *ngx_pcalloc(ngx_pool_t *pool, size_t size);
 ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);
 
index be2dae79bf167cf2752df801825f1c4f3f456af0..fb12ab16be24f3e812f79da821854574771c2a72 100644 (file)
@@ -165,7 +165,7 @@ ngx_regex_malloc(size_t size)
 #endif
 
     if (pool) {
-        return ngx_palloc(pool, size);
+        return ngx_palloc_aligned(pool, size);
     }
 
     return NULL;
index a1c4c9892c62f9076e274ce4069d4b4ca691e70c..e8e059c228cdd54471d125f6986f308555ad5490 100644 (file)
@@ -1024,12 +1024,15 @@ ngx_http_create_locations_tree(ngx_conf_t *cf, ngx_queue_t *locations,
     lq = (ngx_http_location_queue_t *) q;
     len = lq->name->len - prefix;
 
-    node = ngx_pcalloc(cf->pool,
-                       offsetof(ngx_http_location_tree_node_t, name) + len);
+    node = ngx_palloc_aligned(cf->pool,
+                          offsetof(ngx_http_location_tree_node_t, name) + len);
     if (node == NULL) {
         return NULL;
     }
 
+    node->left = NULL;
+    node->right = NULL;
+    node->tree = NULL;
     node->exact = lq->exact;
     node->inclusive = lq->inclusive;