]> git.kaiwu.me - nginx.git/commitdiff
pass the inherited shm_zone data
authorIgor Sysoev <igor@sysoev.ru>
Tue, 9 Jan 2007 15:59:20 +0000 (15:59 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Tue, 9 Jan 2007 15:59:20 +0000 (15:59 +0000)
src/core/ngx_cycle.c
src/core/ngx_cycle.h
src/event/ngx_event_openssl.c
src/http/modules/ngx_http_limit_zone_module.c

index ff4888ab247d295aee556015d51833129e56ac71..2fd20b01b913c3d3ed4eea3ed2511b699790a870 100644 (file)
@@ -402,6 +402,13 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
 
             if (shm_zone[i].shm.size == oshm_zone[n].shm.size) {
                 shm_zone[i].shm.addr = oshm_zone[n].shm.addr;
+
+                if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)
+                    != NGX_OK)
+                {
+                    goto failed;
+                }
+
                 goto found;
             }
 
@@ -446,7 +453,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
 
         ngx_slab_init(shpool);
 
-        if (shm_zone[i].init(&shm_zone[i]) != NGX_OK) {
+        if (shm_zone[i].init(&shm_zone[i], NULL) != NGX_OK) {
             goto failed;
         }
 
index 598fbb93d72696727e0863138a2ba86a82ab914e..21fb86acf024b2c2c3eef2860870227c9a2f7f57 100644 (file)
@@ -23,7 +23,7 @@
 
 typedef struct ngx_shm_zone_s  ngx_shm_zone_t;
 
-typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone);
+typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data);
 
 struct ngx_shm_zone_s {
     void                     *data;
index 7d61dfe4611827e316104ba0b4822d6e554bc29d..dff23ae31c070d8472234e2e929f08a21e5e18f0 100644 (file)
@@ -23,7 +23,8 @@ static void ngx_ssl_shutdown_handler(ngx_event_t *ev);
 static void ngx_ssl_connection_error(ngx_connection_t *c, int sslerr,
     ngx_err_t err, char *text);
 
-static ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone);
+static ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone,
+    void *data);
 static int ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn,
     ngx_ssl_session_t *sess);
 static ngx_ssl_session_t *ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn,
@@ -1184,12 +1185,17 @@ ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx,
 
 
 static ngx_int_t
-ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone)
+ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data)
 {
     ngx_slab_pool_t          *shpool;
     ngx_rbtree_node_t        *sentinel;
     ngx_ssl_session_cache_t  *cache;
 
+    if (data) {
+        shm_zone->data = data;
+        return NGX_OK;
+    }
+
     shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
 
     cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_session_cache_t));
index c2b44ccea1317b80b1aeee4dc1e298eeb5fc9f52..07802581c7eb6b2d264cead97b432f373749b79b 100644 (file)
@@ -247,15 +247,32 @@ ngx_http_limit_zone_cleanup(void *data)
 
 
 static ngx_int_t
-ngx_http_limit_zone_init_zone(ngx_shm_zone_t *shm_zone)
+ngx_http_limit_zone_init_zone(ngx_shm_zone_t *shm_zone, void *data)
 {
+    ngx_http_limit_zone_ctx_t  *octx = data;
+
     ngx_slab_pool_t            *shpool;
     ngx_rbtree_node_t          *sentinel;
     ngx_http_limit_zone_ctx_t  *ctx;
 
-    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
     ctx = shm_zone->data;
 
+    if (octx) {
+        if (ngx_strcmp(ctx->var.data, octx->var.data) != 0) {
+            ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
+                          "limit_zone \"%V\" use the \"%V\" variable "
+                          "while previously it used the \"%V\" variable",
+                          &shm_zone->name, &ctx->var, &octx->var);
+            return NGX_ERROR;
+        }
+
+        ctx->rbtree = octx->rbtree;
+
+        return NGX_OK;
+    }
+
+    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
+
     ctx->rbtree = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_t));
     if (ctx->rbtree == NULL) {
         return NGX_ERROR;