diff --git a/.gitignore b/.gitignore index 378eac2..667fe5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -build +out/ +work/ +t/servroot* +build* +test* diff --git a/Makefile b/Makefile index 881fd8b..f4583f5 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SUBSYS?=http -DESTDIR?=build/src +DESTDIR?=out/src TEMPLATE_SOURCES=$(wildcard src/subsys/*.tt2) TEMPLATE_TARGETS=$(subst _subsys_,_$(SUBSYS)_, $(patsubst src/subsys/%.tt2, $(DESTDIR)/%, $(TEMPLATE_SOURCES))) @@ -7,7 +7,8 @@ API_TEMPLATE_SOURCES=$(wildcard src/subsys/api/*.tt2) API_TEMPLATE_TARGETS=$(subst _subsys_,_$(SUBSYS)_, $(patsubst src/subsys/%.tt2, $(DESTDIR)/%, $(API_TEMPLATE_SOURCES))) MINI_TT2=util/mini-tt2.pl -.PHONY: all +.PHONY: all clean + all: $(DESTDIR)/api $(TEMPLATE_TARGETS) $(API_TEMPLATE_TARGETS) find src/$(SUBSYS) -type f -name '*.tt2' -exec $(MINI_TT2) -d $(DESTDIR) -s $(SUBSYS) '{}' ';' $(shell cp src/$(SUBSYS)/*.{h,c} $(DESTDIR)) @@ -30,6 +31,5 @@ $(DESTDIR)/%: src/subsys/%.tt2 $(DESTDIR)/api: mkdir -p $(DESTDIR)/api -.PHONY: clean clean: - rm -rf build + rm -rf out buildroot work t/servroot* diff --git a/src/http/ngx_http_lua_headerfilterby.c b/src/http/ngx_http_lua_headerfilterby.c index f67e751..95291fe 100644 --- a/src/http/ngx_http_lua_headerfilterby.c +++ b/src/http/ngx_http_lua_headerfilterby.c @@ -19,7 +19,6 @@ #include "ngx_http_lua_string.h" #include "ngx_http_lua_misc.h" #include "ngx_http_lua_consts.h" -#include "ngx_http_lua_shdict.h" static ngx_http_output_header_filter_pt ngx_http_next_header_filter; diff --git a/src/http/ngx_http_lua_setby.c b/src/http/ngx_http_lua_setby.c index f00468c..c6ef36f 100644 --- a/src/http/ngx_http_lua_setby.c +++ b/src/http/ngx_http_lua_setby.c @@ -19,7 +19,6 @@ #include "ngx_http_lua_string.h" #include "ngx_http_lua_misc.h" #include "ngx_http_lua_consts.h" -#include "ngx_http_lua_shdict.h" #include "ngx_http_lua_util.h" diff --git a/src/meta/config b/src/meta/config new file mode 100644 index 0000000..4a334e5 --- /dev/null +++ b/src/meta/config @@ -0,0 +1,13 @@ +ngx_module_type=CORE +ngx_module_name=ngx_meta_lua_module +ngx_module_incs="$ngx_addon_dir" +ngx_module_deps="$ngx_addon_dir/ddebug.h \ + $ngx_addon_dir/ngx_meta_lua_api.h \ + $ngx_addon_dir/ngx_meta_lua_module.h \ + $ngx_addon_dir/ngx_meta_lua_shdict.h" +ngx_module_srcs="$ngx_addon_dir/ngx_meta_lua_module.c \ + $ngx_addon_dir/ngx_meta_lua_shdict.c" +ngx_module_libs= +ngx_module_link=ADDON + +. auto/module diff --git a/src/subsys/ddebug.h.tt2 b/src/meta/ddebug.h similarity index 65% rename from src/subsys/ddebug.h.tt2 rename to src/meta/ddebug.h index 7f01608..7bf22e9 100644 --- a/src/subsys/ddebug.h.tt2 +++ b/src/meta/ddebug.h @@ -56,21 +56,21 @@ dd(const char *fmt, ...) { #define dd_check_read_event_handler(r) \ dd("r->read_event_handler = %s", \ - r->read_event_handler == ngx_http_block_reading ? \ - "ngx_http_block_reading" : \ - r->read_event_handler == ngx_http_test_reading ? \ - "ngx_http_test_reading" : \ - r->read_event_handler == ngx_http_request_empty_handler ? \ - "ngx_http_request_empty_handler" : "UNKNOWN") + r->read_event_handler == ngx_http_block_reading ? \ + "ngx_http_block_reading" : \ + r->read_event_handler == ngx_http_test_reading ? \ + "ngx_http_test_reading" : \ + r->read_event_handler == ngx_http_request_empty_handler ? \ + "ngx_http_request_empty_handler" : "UNKNOWN") #define dd_check_write_event_handler(r) \ dd("r->write_event_handler = %s", \ - r->write_event_handler == ngx_http_handler ? \ - "ngx_http_handler" : \ - r->write_event_handler == ngx_http_core_run_phases ? \ - "ngx_http_core_run_phases" : \ - r->write_event_handler == ngx_http_request_empty_handler ? \ - "ngx_http_request_empty_handler" : "UNKNOWN") + r->write_event_handler == ngx_http_handler ? \ + "ngx_http_handler" : \ + r->write_event_handler == ngx_http_core_run_phases ? \ + "ngx_http_core_run_phases" : \ + r->write_event_handler == ngx_http_request_empty_handler ? \ + "ngx_http_request_empty_handler" : "UNKNOWN") #else diff --git a/src/meta/ngx_meta_lua_api.h b/src/meta/ngx_meta_lua_api.h new file mode 100644 index 0000000..5c8bddc --- /dev/null +++ b/src/meta/ngx_meta_lua_api.h @@ -0,0 +1,37 @@ + +/* + * Copyright (C) Yichun Zhang (agentzh) + */ + + +#ifndef _NGX_META_LUA_API_H_INCLUDED_ +#define _NGX_META_LUA_API_H_INCLUDED_ + + +#include +#include + +#include +#include +#include + + +#define ngx_meta_lua_version 00001 + + +typedef ngx_int_t (*ngx_meta_lua_main_conf_handler_pt)(ngx_log_t *log, + ngx_str_t init_src, lua_State *L); + + +ngx_int_t ngx_meta_lua_post_init_handler(ngx_conf_t *cf, + ngx_meta_lua_main_conf_handler_pt init_handler, ngx_str_t init_src, + lua_State *L); +char *ngx_meta_lua_shdict_directive_helper(ngx_conf_t *cf, void *tag); +void ngx_meta_lua_inject_shdict_api(lua_State *L, ngx_cycle_t *cycle, + void *tag); + + +#endif /* _NGX_META_LUA_API_H_INCLUDED_ */ + + +/* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/meta/ngx_meta_lua_module.c b/src/meta/ngx_meta_lua_module.c new file mode 100644 index 0000000..691d48f --- /dev/null +++ b/src/meta/ngx_meta_lua_module.c @@ -0,0 +1,206 @@ +/* + * Copyright (C) Yichun Zhang (agentzh) + */ + +#include + +#include "ngx_meta_lua_shdict.h" + + +static void *ngx_meta_lua_module_create_conf(ngx_cycle_t *cycle); +static char *ngx_meta_lua_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static ngx_int_t ngx_meta_lua_run_init_handler(ngx_cycle_t *cycle, + ngx_log_t *log, ngx_meta_lua_init_handler_t *inh); + + +static ngx_command_t ngx_meta_lua_cmds[] = { + + { ngx_string("lua"), + NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, + ngx_meta_lua_block, + 0, + 0, + NULL }, + + { ngx_string("lua_shared_dict"), + NGX_META_LUA_CONF|NGX_CONF_TAKE2, + ngx_meta_lua_shdict_directive, + 0, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_core_module_t ngx_meta_lua_module_ctx = { + ngx_string("lua"), + ngx_meta_lua_module_create_conf, + NULL +}; + + +ngx_module_t ngx_meta_lua_module = { + NGX_MODULE_V1, + &ngx_meta_lua_module_ctx, /* module context */ + ngx_meta_lua_cmds, /* module directives */ + NGX_CORE_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_meta_lua_module_create_conf(ngx_cycle_t *cycle) +{ + ngx_meta_lua_conf_t *mcf; + + mcf = ngx_pcalloc(cycle->pool, sizeof(ngx_meta_lua_conf_t)); + if (mcf == NULL) { + return NULL; + } + + mcf->shdict_zones = ngx_array_create(cycle->pool, 2, + sizeof(ngx_shm_zone_t *)); + if (mcf->shdict_zones == NULL) { + return NULL; + } + + mcf->init_handlers = ngx_array_create(cycle->pool, 2, + sizeof(ngx_meta_lua_init_handler_t *)); + if (mcf->init_handlers == NULL) { + return NULL; + } + + return mcf; +} + + +static char * +ngx_meta_lua_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + ngx_conf_t pcf; + ngx_meta_lua_conf_t *mcf = *(ngx_meta_lua_conf_t **) conf; + + if (mcf->parsed_lua_block) { + return "is duplicate"; + } + + /* parse the lua{} block */ + + mcf->parsed_lua_block = 1; + + pcf = *cf; + + cf->ctx = mcf; + cf->module_type = NGX_CORE_MODULE; + cf->cmd_type = NGX_META_LUA_CONF; + + rv = ngx_conf_parse(cf, NULL); + + *cf = pcf; + + if (rv != NGX_CONF_OK) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +ngx_int_t +ngx_meta_lua_post_init_handler(ngx_conf_t *cf, + ngx_meta_lua_main_conf_handler_pt init_handler, ngx_str_t init_src, + lua_State *L) +{ + ngx_meta_lua_conf_t *mcf; + ngx_meta_lua_init_handler_t **inhp, *inh, iinh; + + if (init_handler == NULL) { + return NGX_OK; + } + + mcf = ngx_meta_lua_conf_get_main_conf(cf); + + if (!mcf->delay_init_handlers) { + iinh.init_handler = init_handler; + iinh.init_src = init_src; + iinh.L = L; + + return ngx_meta_lua_run_init_handler(cf->cycle, cf->log, &iinh); + } + + inh = ngx_palloc(cf->pool, sizeof(ngx_meta_lua_init_handler_t)); + if (inh == NULL) { + return NGX_ERROR; + } + + inh->init_handler = init_handler; + inh->init_src = init_src; + inh->L = L; + + inhp = ngx_array_push(mcf->init_handlers); + if (inhp == NULL) { + return NGX_ERROR; + } + + *inhp = inh; + + return NGX_OK; +} + + +ngx_int_t +ngx_meta_lua_run_delayed_init_handlers(ngx_meta_lua_conf_t *mcf, + ngx_cycle_t *cycle, ngx_log_t *log) +{ + ngx_uint_t i; + ngx_meta_lua_init_handler_t **inhp; + + inhp = mcf->init_handlers->elts; + + /* respect order in which the modules were compiled */ + + for (i = 0; i < mcf->init_handlers->nelts; i++) { + ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, + "lua run delayed init_handler: %p", inhp[i]); + + if (ngx_meta_lua_run_init_handler(cycle, log, inhp[i]) != NGX_OK) { + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_meta_lua_run_init_handler(ngx_cycle_t *cycle, ngx_log_t *log, + ngx_meta_lua_init_handler_t *inh) +{ + volatile ngx_cycle_t *saved_cycle; + ngx_int_t rc; + + saved_cycle = ngx_cycle; + ngx_cycle = cycle; + + rc = inh->init_handler(log, inh->init_src, inh->L); + + ngx_cycle = saved_cycle; + + if (rc != NGX_OK) { + return NGX_ERROR; + } + + return NGX_OK; +} + + +/* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/meta/ngx_meta_lua_module.h b/src/meta/ngx_meta_lua_module.h new file mode 100644 index 0000000..40598a0 --- /dev/null +++ b/src/meta/ngx_meta_lua_module.h @@ -0,0 +1,53 @@ + +/* + * Copyright (C) Yichun Zhang (agentzh) + */ + + +#ifndef _NGX_META_LUA_H_INCLUDED_ +#define _NGX_META_LUA_H_INCLUDED_ + + +#include "ngx_meta_lua_api.h" + + +#define NGX_META_LUA_MODULE 0x41554c4d /* "MLUA" */ +#define NGX_META_LUA_CONF 0x02000000 + + +#define ngx_meta_lua_conf_get_main_conf(cf) \ + ((ngx_meta_lua_conf_t *) ngx_get_conf(cf->cycle->conf_ctx, \ + ngx_meta_lua_module)) + +#define ngx_meta_lua_cycle_get_main_conf(cycle) \ + ((ngx_meta_lua_conf_t *) ngx_get_conf(cycle->conf_ctx, \ + ngx_meta_lua_module)) + + +typedef struct { + ngx_uint_t shm_zones_inited; + ngx_array_t *shdict_zones; + ngx_array_t *init_handlers; + unsigned delay_init_handlers:1; + unsigned parsed_lua_block:1; +} ngx_meta_lua_conf_t; + + +typedef struct { + ngx_meta_lua_main_conf_handler_pt init_handler; + ngx_str_t init_src; + lua_State *L; +} ngx_meta_lua_init_handler_t; + + +extern ngx_module_t ngx_meta_lua_module; + + +ngx_int_t ngx_meta_lua_run_delayed_init_handlers(ngx_meta_lua_conf_t *mcf, + ngx_cycle_t *cycle, ngx_log_t *log); + + +#endif /* _NGX_META_LUA_H_INCLUDED_ */ + + +/* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/subsys/ngx_subsys_lua_shdict.c.tt2 b/src/meta/ngx_meta_lua_shdict.c similarity index 69% rename from src/subsys/ngx_subsys_lua_shdict.c.tt2 rename to src/meta/ngx_meta_lua_shdict.c index 5d55980..1b4f3e6 100644 --- a/src/subsys/ngx_subsys_lua_shdict.c.tt2 +++ b/src/meta/ngx_meta_lua_shdict.c @@ -1,47 +1,52 @@ - /* * Copyright (C) Yichun Zhang (agentzh) */ - #ifndef DDEBUG #define DDEBUG 0 #endif #include "ddebug.h" -#include "ngx_[% subsys %]_lua_shdict.h" -#include "ngx_[% subsys %]_lua_util.h" -#include "ngx_[% subsys %]_lua_api.h" +#include "ngx_meta_lua_shdict.h" -static int ngx_[% subsys %]_lua_shdict_expire(ngx_[% subsys %]_lua_shdict_ctx_t *ctx, - ngx_uint_t n); -static ngx_int_t ngx_[% subsys %]_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, - ngx_uint_t hash, u_char *kdata, size_t klen, - ngx_[% subsys %]_lua_shdict_node_t **sdp); -static int ngx_[% subsys %]_lua_shdict_flush_expired(lua_State *L); -static int ngx_[% subsys %]_lua_shdict_get_keys(lua_State *L); -static int ngx_[% subsys %]_lua_shdict_lpush(lua_State *L); -static int ngx_[% subsys %]_lua_shdict_rpush(lua_State *L); -static int ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags); -static int ngx_[% subsys %]_lua_shdict_lpop(lua_State *L); -static int ngx_[% subsys %]_lua_shdict_rpop(lua_State *L); -static int ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags); -static int ngx_[% subsys %]_lua_shdict_llen(lua_State *L); - - -static ngx_inline ngx_shm_zone_t *ngx_[% subsys %]_lua_shdict_get_zone(lua_State *L, +char *ngx_meta_lua_shdict_directive_helper(ngx_conf_t *cf, void *tag); +static ngx_int_t ngx_meta_lua_shdict_init(ngx_shm_zone_t *shm_zone, + void *data); +static ngx_int_t ngx_meta_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, + void *data); +static void ngx_meta_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp, + ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); +static ngx_inline ngx_shm_zone_t *ngx_meta_lua_shdict_get_zone(lua_State *L, int index); +static ngx_int_t ngx_meta_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, + ngx_uint_t hash, u_char *kdata, size_t klen, + ngx_meta_lua_shdict_node_t **sdp); +static ngx_inline ngx_queue_t * + ngx_meta_lua_shdict_get_list_head(ngx_meta_lua_shdict_node_t *sd, + size_t len); +static int ngx_meta_lua_shdict_expire(ngx_meta_lua_shdict_ctx_t *ctx, + ngx_uint_t n); +#if (NGX_DEBUG) +static int ngx_meta_lua_shdict_get_info(lua_State *L); +#endif +static int ngx_meta_lua_shdict_push_helper(lua_State *L, int flags); +static int ngx_meta_lua_shdict_pop_helper(lua_State *L, int flags); +static int ngx_meta_lua_shdict_flush_expired(lua_State *L); +static int ngx_meta_lua_shdict_get_keys(lua_State *L); +static int ngx_meta_lua_shdict_lpush(lua_State *L); +static int ngx_meta_lua_shdict_rpush(lua_State *L); +static int ngx_meta_lua_shdict_lpop(lua_State *L); +static int ngx_meta_lua_shdict_rpop(lua_State *L); +static int ngx_meta_lua_shdict_llen(lua_State *L); -#define NGX_[% SUBSYS %]_LUA_SHDICT_ADD 0x0001 -#define NGX_[% SUBSYS %]_LUA_SHDICT_REPLACE 0x0002 -#define NGX_[% SUBSYS %]_LUA_SHDICT_SAFE_STORE 0x0004 - - -#define NGX_[% SUBSYS %]_LUA_SHDICT_LEFT 0x0001 -#define NGX_[% SUBSYS %]_LUA_SHDICT_RIGHT 0x0002 +#define NGX_META_LUA_SHDICT_ADD 0x0001 +#define NGX_META_LUA_SHDICT_REPLACE 0x0002 +#define NGX_META_LUA_SHDICT_SAFE_STORE 0x0004 +#define NGX_META_LUA_SHDICT_LEFT 0x0001 +#define NGX_META_LUA_SHDICT_RIGHT 0x0002 enum { @@ -58,30 +63,166 @@ enum { }; -static ngx_inline ngx_queue_t * -ngx_[% subsys %]_lua_shdict_get_list_head(ngx_[% subsys %]_lua_shdict_node_t *sd, - size_t len) +char * +ngx_meta_lua_shdict_directive(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf) { - return (ngx_queue_t *) ngx_align_ptr(((u_char *) &sd->data + len), - NGX_ALIGNMENT); + return ngx_meta_lua_shdict_directive_helper(cf, &ngx_meta_lua_module); +} + + +char * +ngx_meta_lua_shdict_directive_helper(ngx_conf_t *cf, void *tag) +{ + ngx_meta_lua_conf_t *mcf; + ngx_meta_lua_shdict_ctx_t *shdict_ctx; + ngx_meta_lua_shm_zone_ctx_t *shm_zone_ctx; + ngx_shm_zone_t *zone; + ngx_shm_zone_t **zp; + ngx_str_t name, *value; + ssize_t size; + + mcf = ngx_meta_lua_conf_get_main_conf(cf); + + /* args */ + + value = cf->args->elts; + name = value[1]; + size = ngx_parse_size(&value[2]); + + if (name.len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid lua shared dict name \"%V\"", &name); + return NGX_CONF_ERROR; + } + + if (size <= 8191) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid lua shared dict size \"%V\"", &value[2]); + return NGX_CONF_ERROR; + } + + /* shm zone */ + + zone = ngx_shared_memory_add(cf, &name, size, tag); + if (zone == NULL) { + return NGX_CONF_ERROR; + } + + shm_zone_ctx = ngx_pcalloc(cf->pool, sizeof(ngx_meta_lua_shm_zone_ctx_t)); + if (shm_zone_ctx == NULL) { + return NGX_CONF_ERROR; + } + + if (zone->data) { + shdict_ctx = zone->data; + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "lua_shared_dict \"%V\" is already defined as " + "\"%V\"", &name, &name); + return NGX_CONF_ERROR; + } + + shm_zone_ctx->mcf = mcf; + shm_zone_ctx->log = &cf->cycle->new_log; + shm_zone_ctx->cycle = cf->cycle; + + ngx_memcpy(&shm_zone_ctx->zone, zone, sizeof(ngx_shm_zone_t)); + + zone->init = ngx_meta_lua_shdict_init; + zone->data = shm_zone_ctx; + + /* shdict */ + + shdict_ctx = ngx_pcalloc(cf->pool, sizeof(ngx_meta_lua_shdict_ctx_t)); + if (shdict_ctx == NULL) { + return NGX_CONF_ERROR; + } + + shdict_ctx->name = name; + shdict_ctx->mcf = mcf; + shdict_ctx->log = &cf->cycle->new_log; + + zone = &shm_zone_ctx->zone; + + zone->init = ngx_meta_lua_shdict_init_zone; + zone->data = shdict_ctx; + + zp = ngx_array_push(mcf->shdict_zones); + if (zp == NULL) { + return NGX_CONF_ERROR; + } + + *zp = &shm_zone_ctx->zone; + + mcf->delay_init_handlers = 1; + + return NGX_CONF_OK; } -ngx_int_t -ngx_[% subsys %]_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data) +static ngx_int_t +ngx_meta_lua_shdict_init(ngx_shm_zone_t *shm_zone, void *data) { - ngx_[% subsys %]_lua_shdict_ctx_t *octx = data; - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; + ngx_int_t rc; + ngx_shm_zone_t *zone, *ozone; + ngx_meta_lua_shm_zone_ctx_t *ctx, *octx = data; + ngx_meta_lua_conf_t *mcf; + void *odata = NULL; + + ctx = (ngx_meta_lua_shm_zone_ctx_t *) shm_zone->data; + zone = &ctx->zone; + + if (octx) { + ozone = &octx->zone; + odata = ozone->data; + } + + zone->shm = shm_zone->shm; +#if defined(nginx_version) && nginx_version >= 1009000 + zone->noreuse = shm_zone->noreuse; +#endif + + if (zone->init(zone, odata) != NGX_OK) { + return NGX_ERROR; + } + + mcf = ctx->mcf; + if (mcf == NULL) { + return NGX_ERROR; + } + + mcf->shm_zones_inited++; + + if (mcf->shm_zones_inited == mcf->shdict_zones->nelts && !ngx_test_config) { + rc = ngx_meta_lua_run_delayed_init_handlers(mcf, ctx->cycle, ctx->log); + if (rc != NGX_OK) { + return NGX_ERROR; + } + } + + return NGX_OK; +} - size_t len; - dd("init zone"); +static ngx_int_t +ngx_meta_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data) +{ + size_t len; + ngx_meta_lua_shdict_ctx_t *ctx, *octx = data; ctx = shm_zone->data; +#if (NGX_DEBUG) + ctx->isinit = 1; +#endif + if (octx) { ctx->sh = octx->sh; ctx->shpool = octx->shpool; +#if (NGX_DEBUG) + ctx->isold = 1; +#endif return NGX_OK; } @@ -94,16 +235,16 @@ ngx_[% subsys %]_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data) return NGX_OK; } - ctx->sh = ngx_slab_alloc(ctx->shpool, - sizeof(ngx_[% subsys %]_lua_shdict_shctx_t)); + ctx->shpool->data = ctx->sh; + ctx->shpool->log_nomem = 0; + + ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_meta_lua_shdict_shctx_t)); if (ctx->sh == NULL) { return NGX_ERROR; } - ctx->shpool->data = ctx->sh; - ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel, - ngx_[% subsys %]_lua_shdict_rbtree_insert_value); + ngx_meta_lua_shdict_rbtree_insert_value); ngx_queue_init(&ctx->sh->lru_queue); @@ -117,19 +258,16 @@ ngx_[% subsys %]_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data) ngx_sprintf(ctx->shpool->log_ctx, " in lua_shared_dict zone \"%V\"%Z", &shm_zone->shm.name); - ctx->shpool->log_nomem = 0; - return NGX_OK; } -void -ngx_[% subsys %]_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp, +static void +ngx_meta_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) { ngx_rbtree_node_t **p; - - ngx_[% subsys %]_lua_shdict_node_t *sdn, *sdnt; + ngx_meta_lua_shdict_node_t *sdn, *sdnt; for ( ;; ) { @@ -143,8 +281,8 @@ ngx_[% subsys %]_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp, } else { /* node->key == temp->key */ - sdn = (ngx_[% subsys %]_lua_shdict_node_t *) &node->color; - sdnt = (ngx_[% subsys %]_lua_shdict_node_t *) &temp->color; + sdn = (ngx_meta_lua_shdict_node_t *) &node->color; + sdnt = (ngx_meta_lua_shdict_node_t *) &temp->color; p = ngx_memn2cmp(sdn->data, sdnt->data, sdn->key_len, sdnt->key_len) < 0 ? &temp->left : &temp->right; @@ -165,18 +303,100 @@ ngx_[% subsys %]_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp, } +void +ngx_meta_lua_inject_shdict_api(lua_State *L, ngx_cycle_t *cycle, void *tag) +{ + int nrec; + ngx_uint_t i; + ngx_meta_lua_conf_t *mcf; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_shm_zone_t **zone; + ngx_shm_zone_t **zone_udata; + + mcf = ngx_meta_lua_cycle_get_main_conf(cycle); + + if (mcf->shdict_zones->nelts) { + nrec = 0; + zone = mcf->shdict_zones->elts; + + for (i = 0; i < mcf->shdict_zones->nelts; i++) { + if (zone[i]->tag == tag || zone[i]->tag == &ngx_meta_lua_module) { + nrec += 1; + } + } + + lua_createtable(L, 0, nrec); /* ngx.shared */ + + lua_createtable(L, 0 /* narr */, 22 /* nrec */); /* shared mt */ + + lua_pushcfunction(L, ngx_meta_lua_shdict_lpush); + lua_setfield(L, -2, "lpush"); + + lua_pushcfunction(L, ngx_meta_lua_shdict_rpush); + lua_setfield(L, -2, "rpush"); + + lua_pushcfunction(L, ngx_meta_lua_shdict_lpop); + lua_setfield(L, -2, "lpop"); + + lua_pushcfunction(L, ngx_meta_lua_shdict_rpop); + lua_setfield(L, -2, "rpop"); + + lua_pushcfunction(L, ngx_meta_lua_shdict_llen); + lua_setfield(L, -2, "llen"); + + lua_pushcfunction(L, ngx_meta_lua_shdict_flush_expired); + lua_setfield(L, -2, "flush_expired"); + + lua_pushcfunction(L, ngx_meta_lua_shdict_get_keys); + lua_setfield(L, -2, "get_keys"); + +#if (NGX_DEBUG) + lua_pushcfunction(L, ngx_meta_lua_shdict_get_info); + lua_setfield(L, -2, "get_info"); +#endif + + lua_pushvalue(L, -1); /* shared mt mt */ + lua_setfield(L, -2, "__index"); /* shared mt */ + + for (i = 0; i < mcf->shdict_zones->nelts; i++) { + if (zone[i]->tag == tag || zone[i]->tag == &ngx_meta_lua_module) { + ctx = zone[i]->data; + + lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len); + /* shared mt key */ + lua_createtable(L, 1 /* narr */, 0 /* nrec */); + /* table of zone[i] */ + zone_udata = lua_newuserdata(L, sizeof(ngx_shm_zone_t *)); + /* shared mt key ud */ + *zone_udata = zone[i]; + lua_rawseti(L, -2, SHDICT_USERDATA_INDEX); /* {zone[i]} */ + lua_pushvalue(L, -3); /* shared mt key ud mt */ + lua_setmetatable(L, -2); /* shared mt key ud */ + lua_rawset(L, -4); /* shared mt */ + } + } + + lua_pop(L, 1); /* shared */ + + } else { + lua_newtable(L); /* ngx.shared */ + } + + lua_setfield(L, -2, "shared"); +} + + static ngx_int_t -ngx_[% subsys %]_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, - u_char *kdata, size_t klen, ngx_[% subsys %]_lua_shdict_node_t **sdp) +ngx_meta_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, + u_char *kdata, size_t klen, ngx_meta_lua_shdict_node_t **sdp) { + int64_t ms; + uint64_t now; ngx_int_t rc; ngx_time_t *tp; - uint64_t now; - int64_t ms; ngx_rbtree_node_t *node, *sentinel; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; ctx = shm_zone->data; @@ -197,7 +417,7 @@ ngx_[% subsys %]_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, /* hash == node->key */ - sd = (ngx_[% subsys %]_lua_shdict_node_t *) &node->color; + sd = (ngx_meta_lua_shdict_node_t *) &node->color; rc = ngx_memn2cmp(kdata, sd->data, klen, (size_t) sd->key_len); @@ -236,17 +456,16 @@ ngx_[% subsys %]_lua_shdict_lookup(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, static int -ngx_[% subsys %]_lua_shdict_expire(ngx_[% subsys %]_lua_shdict_ctx_t *ctx, ngx_uint_t n) +ngx_meta_lua_shdict_expire(ngx_meta_lua_shdict_ctx_t *ctx, ngx_uint_t n) { - ngx_time_t *tp; + int freed = 0; + int64_t ms; uint64_t now; + ngx_time_t *tp; ngx_queue_t *q, *list_queue, *lq; - int64_t ms; ngx_rbtree_node_t *node; - int freed = 0; - - ngx_[% subsys %]_lua_shdict_node_t *sd; - ngx_[% subsys %]_lua_shdict_list_node_t *lnode; + ngx_meta_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_list_node_t *lnode; tp = ngx_timeofday(); @@ -266,7 +485,7 @@ ngx_[% subsys %]_lua_shdict_expire(ngx_[% subsys %]_lua_shdict_ctx_t *ctx, ngx_u q = ngx_queue_last(&ctx->sh->lru_queue); - sd = ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_node_t, queue); + sd = ngx_queue_data(q, ngx_meta_lua_shdict_node_t, queue); if (n++ != 0) { @@ -281,14 +500,13 @@ ngx_[% subsys %]_lua_shdict_expire(ngx_[% subsys %]_lua_shdict_ctx_t *ctx, ngx_u } if (sd->value_type == SHDICT_TLIST) { - list_queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, - sd->key_len); + list_queue = ngx_meta_lua_shdict_get_list_head(sd, sd->key_len); for (lq = ngx_queue_head(list_queue); lq != ngx_queue_sentinel(list_queue); lq = ngx_queue_next(lq)) { - lnode = ngx_queue_data(lq, ngx_[% subsys %]_lua_shdict_list_node_t, + lnode = ngx_queue_data(lq, ngx_meta_lua_shdict_list_node_t, queue); ngx_slab_free_locked(ctx->shpool, lnode); @@ -311,78 +529,9 @@ ngx_[% subsys %]_lua_shdict_expire(ngx_[% subsys %]_lua_shdict_ctx_t *ctx, ngx_u } -void -ngx_[% subsys %]_lua_inject_shdict_api(ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L) -{ - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - - ngx_uint_t i; - ngx_shm_zone_t **zone; - ngx_shm_zone_t **zone_udata; - - if (lmcf->shdict_zones != NULL) { - lua_createtable(L, 0, lmcf->shdict_zones->nelts /* nrec */); - /* ngx.shared */ - - lua_createtable(L, 0 /* narr */, 22 /* nrec */); /* shared mt */ - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_lpush); - lua_setfield(L, -2, "lpush"); - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_rpush); - lua_setfield(L, -2, "rpush"); - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_lpop); - lua_setfield(L, -2, "lpop"); - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_rpop); - lua_setfield(L, -2, "rpop"); - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_llen); - lua_setfield(L, -2, "llen"); - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_flush_expired); - lua_setfield(L, -2, "flush_expired"); - - lua_pushcfunction(L, ngx_[% subsys %]_lua_shdict_get_keys); - lua_setfield(L, -2, "get_keys"); - - lua_pushvalue(L, -1); /* shared mt mt */ - lua_setfield(L, -2, "__index"); /* shared mt */ - - zone = lmcf->shdict_zones->elts; - - for (i = 0; i < lmcf->shdict_zones->nelts; i++) { - ctx = zone[i]->data; - - lua_pushlstring(L, (char *) ctx->name.data, ctx->name.len); - /* shared mt key */ - - lua_createtable(L, 1 /* narr */, 0 /* nrec */); - /* table of zone[i] */ - zone_udata = lua_newuserdata(L, sizeof(ngx_shm_zone_t *)); - /* shared mt key ud */ - *zone_udata = zone[i]; - lua_rawseti(L, -2, SHDICT_USERDATA_INDEX); /* {zone[i]} */ - lua_pushvalue(L, -3); /* shared mt key ud mt */ - lua_setmetatable(L, -2); /* shared mt key ud */ - lua_rawset(L, -4); /* shared mt */ - } - - lua_pop(L, 1); /* shared */ - - } else { - lua_newtable(L); /* ngx.shared */ - } - - lua_setfield(L, -2, "shared"); -} - - static ngx_inline ngx_shm_zone_t * -ngx_[% subsys %]_lua_shdict_get_zone(lua_State *L, int index) +ngx_meta_lua_shdict_get_zone(lua_State *L, int index) { - ngx_shm_zone_t *zone; ngx_shm_zone_t **zone_udata; lua_rawgeti(L, index, SHDICT_USERDATA_INDEX); @@ -393,26 +542,31 @@ ngx_[% subsys %]_lua_shdict_get_zone(lua_State *L, int index) return NULL; } - zone = *zone_udata; - return zone; + return *zone_udata; +} + + +static ngx_inline ngx_queue_t * +ngx_meta_lua_shdict_get_list_head(ngx_meta_lua_shdict_node_t *sd, size_t len) +{ + return (ngx_queue_t *) ngx_align_ptr(((u_char *) &sd->data + len), + NGX_ALIGNMENT); } static int -ngx_[% subsys %]_lua_shdict_flush_expired(lua_State *L) +ngx_meta_lua_shdict_flush_expired(lua_State *L) { + uint64_t now; + int n; + int freed = 0, attempts = 0; ngx_queue_t *q, *prev, *list_queue, *lq; ngx_shm_zone_t *zone; ngx_time_t *tp; - int freed = 0; - int attempts = 0; ngx_rbtree_node_t *node; - uint64_t now; - int n; - - ngx_[% subsys %]_lua_shdict_node_t *sd; - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_list_node_t *lnode; + ngx_meta_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_list_node_t *lnode; n = lua_gettop(L); @@ -422,7 +576,7 @@ ngx_[% subsys %]_lua_shdict_flush_expired(lua_State *L) luaL_checktype(L, 1, LUA_TTABLE); - zone = ngx_[% subsys %]_lua_shdict_get_zone(L, 1); + zone = ngx_meta_lua_shdict_get_zone(L, 1); if (zone == NULL) { return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer"); } @@ -450,20 +604,18 @@ ngx_[% subsys %]_lua_shdict_flush_expired(lua_State *L) while (q != ngx_queue_sentinel(&ctx->sh->lru_queue)) { prev = ngx_queue_prev(q); - sd = ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_node_t, queue); + sd = ngx_queue_data(q, ngx_meta_lua_shdict_node_t, queue); if (sd->expires != 0 && sd->expires <= now) { if (sd->value_type == SHDICT_TLIST) { - list_queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, - sd->key_len); + list_queue = ngx_meta_lua_shdict_get_list_head(sd, sd->key_len); for (lq = ngx_queue_head(list_queue); lq != ngx_queue_sentinel(list_queue); lq = ngx_queue_next(lq)) { - lnode = ngx_queue_data(lq, - ngx_[% subsys %]_lua_shdict_list_node_t, + lnode = ngx_queue_data(lq, ngx_meta_lua_shdict_list_node_t, queue); ngx_slab_free_locked(ctx->shpool, lnode); @@ -490,27 +642,21 @@ ngx_[% subsys %]_lua_shdict_flush_expired(lua_State *L) ngx_shmtx_unlock(&ctx->shpool->mutex); lua_pushnumber(L, freed); + return 1; } -/* - * This trades CPU for memory. This is potentially slow. O(2n) - */ - static int -ngx_[% subsys %]_lua_shdict_get_keys(lua_State *L) +ngx_meta_lua_shdict_get_keys(lua_State *L) { + int n, total = 0, attempts = 1024; + uint64_t now; ngx_queue_t *q, *prev; ngx_shm_zone_t *zone; ngx_time_t *tp; - int total = 0; - int attempts = 1024; - uint64_t now; - int n; - - ngx_[% subsys %]_lua_shdict_node_t *sd; - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; n = lua_gettop(L); @@ -521,7 +667,7 @@ ngx_[% subsys %]_lua_shdict_get_keys(lua_State *L) luaL_checktype(L, 1, LUA_TTABLE); - zone = ngx_[% subsys %]_lua_shdict_get_zone(L, 1); + zone = ngx_meta_lua_shdict_get_zone(L, 1); if (zone == NULL) { return luaL_error(L, "bad user data for the ngx_shm_zone_t pointer"); } @@ -551,7 +697,7 @@ ngx_[% subsys %]_lua_shdict_get_keys(lua_State *L) while (q != ngx_queue_sentinel(&ctx->sh->lru_queue)) { prev = ngx_queue_prev(q); - sd = ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_node_t, queue); + sd = ngx_queue_data(q, ngx_meta_lua_shdict_node_t, queue); if (sd->expires == 0 || sd->expires > now) { total++; @@ -573,7 +719,7 @@ ngx_[% subsys %]_lua_shdict_get_keys(lua_State *L) while (q != ngx_queue_sentinel(&ctx->sh->lru_queue)) { prev = ngx_queue_prev(q); - sd = ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_node_t, queue); + sd = ngx_queue_data(q, ngx_meta_lua_shdict_node_t, queue); if (sd->expires == 0 || sd->expires > now) { lua_pushlstring(L, (char *) sd->data, sd->key_len); @@ -593,143 +739,48 @@ ngx_[% subsys %]_lua_shdict_get_keys(lua_State *L) } -[% IF http_subsys %] -ngx_int_t -ngx_[% subsys %]_lua_shared_dict_get(ngx_shm_zone_t *zone, u_char *key_data, - size_t key_len, ngx_[% subsys %]_lua_value_t *value) +static int +ngx_meta_lua_shdict_lpush(lua_State *L) { - u_char *data; - size_t len; - uint32_t hash; - ngx_int_t rc; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; - - if (zone == NULL) { - return NGX_ERROR; - } - - hash = ngx_crc32_short(key_data, key_len); - - ctx = zone->data; - - ngx_shmtx_lock(&ctx->shpool->mutex); - - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key_data, key_len, &sd); - - dd("shdict lookup returned %d", (int) rc); - - if (rc == NGX_DECLINED || rc == NGX_DONE) { - ngx_shmtx_unlock(&ctx->shpool->mutex); - - return rc; - } - - /* rc == NGX_OK */ - - value->type = sd->value_type; - - dd("type: %d", (int) value->type); - - data = sd->data + sd->key_len; - len = (size_t) sd->value_len; - - switch (value->type) { - - case SHDICT_TSTRING: - - if (value->value.s.data == NULL || value->value.s.len == 0) { - ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "no string buffer " - "initialized"); - ngx_shmtx_unlock(&ctx->shpool->mutex); - return NGX_ERROR; - } - - if (len > value->value.s.len) { - len = value->value.s.len; - - } else { - value->value.s.len = len; - } - - ngx_memcpy(value->value.s.data, data, len); - break; - - case SHDICT_TNUMBER: - - if (len != sizeof(double)) { - ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua number " - "value size found for key %*s: %lu", key_len, - key_data, (unsigned long) len); - - ngx_shmtx_unlock(&ctx->shpool->mutex); - return NGX_ERROR; - } - - ngx_memcpy(&value->value.b, data, len); - break; - - case SHDICT_TBOOLEAN: - - if (len != sizeof(u_char)) { - ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua boolean " - "value size found for key %*s: %lu", key_len, - key_data, (unsigned long) len); - - ngx_shmtx_unlock(&ctx->shpool->mutex); - return NGX_ERROR; - } - - value->value.b = *data; - break; - - default: - ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "bad lua value type " - "found for key %*s: %d", key_len, key_data, - (int) value->type); + return ngx_meta_lua_shdict_push_helper(L, NGX_META_LUA_SHDICT_LEFT); +} - ngx_shmtx_unlock(&ctx->shpool->mutex); - return NGX_ERROR; - } - ngx_shmtx_unlock(&ctx->shpool->mutex); - return NGX_OK; +static int +ngx_meta_lua_shdict_rpush(lua_State *L) +{ + return ngx_meta_lua_shdict_push_helper(L, NGX_META_LUA_SHDICT_RIGHT); } -[% END %] static int -ngx_[% subsys %]_lua_shdict_lpush(lua_State *L) +ngx_meta_lua_shdict_lpop(lua_State *L) { - return ngx_[% subsys %]_lua_shdict_push_helper(L, NGX_[% SUBSYS %]_LUA_SHDICT_LEFT); + return ngx_meta_lua_shdict_pop_helper(L, NGX_META_LUA_SHDICT_LEFT); } static int -ngx_[% subsys %]_lua_shdict_rpush(lua_State *L) +ngx_meta_lua_shdict_rpop(lua_State *L) { - return ngx_[% subsys %]_lua_shdict_push_helper(L, NGX_[% SUBSYS %]_LUA_SHDICT_RIGHT); + return ngx_meta_lua_shdict_pop_helper(L, NGX_META_LUA_SHDICT_RIGHT); } static int -ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) +ngx_meta_lua_shdict_push_helper(lua_State *L, int flags) { - int n; - ngx_str_t key; + int n, value_type; + double num; uint32_t hash; + ngx_str_t key, value; ngx_int_t rc; - ngx_str_t value; - int value_type; - double num; ngx_rbtree_node_t *node; ngx_shm_zone_t *zone; ngx_queue_t *queue, *q; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; - ngx_[% subsys %]_lua_shdict_list_node_t *lnode; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_list_node_t *lnode; n = lua_gettop(L); @@ -742,7 +793,7 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) return luaL_error(L, "bad \"zone\" argument"); } - zone = ngx_[% subsys %]_lua_shdict_get_zone(L, 1); + zone = ngx_meta_lua_shdict_get_zone(L, 1); if (zone == NULL) { return luaL_error(L, "bad \"zone\" argument"); } @@ -794,10 +845,10 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) ngx_shmtx_lock(&ctx->shpool->mutex); #if 1 - ngx_[% subsys %]_lua_shdict_expire(ctx, 1); + ngx_meta_lua_shdict_expire(ctx, 1); #endif - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key.data, key.len, &sd); + rc = ngx_meta_lua_shdict_lookup(zone, hash, key.data, key.len, &sd); dd("shdict lookup returned %d", (int) rc); @@ -808,7 +859,7 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) if (sd->value_type != SHDICT_TLIST) { /* TODO: reuse when length matched */ - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict push: found old entry and value " "type not matched, remove it first"); @@ -825,7 +876,7 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) goto init_list; } - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict push: found old entry and value " "type matched, reusing it"); @@ -833,14 +884,14 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) /* free list nodes */ - queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, key.len); + queue = ngx_meta_lua_shdict_get_list_head(sd, key.len); for (q = ngx_queue_head(queue); q != ngx_queue_sentinel(queue); q = ngx_queue_next(q)) { /* TODO: reuse matched size list node */ - lnode = ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_list_node_t, queue); + lnode = ngx_queue_data(q, ngx_meta_lua_shdict_list_node_t, queue); ngx_slab_free_locked(ctx->shpool, lnode); } @@ -865,7 +916,7 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) return 2; } - queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, key.len); + queue = ngx_meta_lua_shdict_get_list_head(sd, key.len); ngx_queue_remove(&sd->queue); ngx_queue_insert_head(&ctx->sh->lru_queue, &sd->queue); @@ -878,12 +929,12 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) init_list: - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict list: creating a new entry"); /* NOTICE: we assume the begin point aligned in slab, be careful */ n = offsetof(ngx_rbtree_node_t, color) - + offsetof(ngx_[% subsys %]_lua_shdict_node_t, data) + + offsetof(ngx_meta_lua_shdict_node_t, data) + key.len + sizeof(ngx_queue_t); @@ -903,19 +954,17 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) return 2; } - sd = (ngx_[% subsys %]_lua_shdict_node_t *) &node->color; + sd = (ngx_meta_lua_shdict_node_t *) &node->color; - queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, key.len); + queue = ngx_meta_lua_shdict_get_list_head(sd, key.len); node->key = hash; - sd->key_len = (u_short) key.len; - - sd->expires = 0; - - sd->value_len = 0; dd("setting value type to %d", (int) SHDICT_TLIST); + sd->key_len = (u_short) key.len; + sd->expires = 0; + sd->value_len = 0; sd->value_type = (uint8_t) SHDICT_TLIST; ngx_memcpy(sd->data, key.data, key.len); @@ -928,10 +977,10 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) push_node: - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict list: creating a new list node"); - n = offsetof(ngx_[% subsys %]_lua_shdict_list_node_t, data) + n = offsetof(ngx_meta_lua_shdict_list_node_t, data) + value.len; dd("list node length: %d", n); @@ -942,7 +991,7 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) if (sd->value_len == 0) { - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict list: no memory for create" " list node and list empty, remove it"); @@ -964,20 +1013,17 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) } dd("setting list length to %d", sd->value_len + 1); + dd("setting list node value length to %d", (int) value.len); + dd("setting list node value type to %d", value_type); sd->value_len = sd->value_len + 1; - dd("setting list node value length to %d", (int) value.len); - lnode->value_len = (uint32_t) value.len; - - dd("setting list node value type to %d", value_type); - lnode->value_type = (uint8_t) value_type; ngx_memcpy(lnode->data, value.data, value.len); - if (flags == NGX_[% SUBSYS %]_LUA_SHDICT_LEFT) { + if (flags == NGX_META_LUA_SHDICT_LEFT) { ngx_queue_insert_head(queue, &lnode->queue); } else { @@ -992,37 +1038,19 @@ ngx_[% subsys %]_lua_shdict_push_helper(lua_State *L, int flags) static int -ngx_[% subsys %]_lua_shdict_lpop(lua_State *L) -{ - return ngx_[% subsys %]_lua_shdict_pop_helper(L, NGX_[% SUBSYS %]_LUA_SHDICT_LEFT); -} - - -static int -ngx_[% subsys %]_lua_shdict_rpop(lua_State *L) +ngx_meta_lua_shdict_pop_helper(lua_State *L, int flags) { - return ngx_[% subsys %]_lua_shdict_pop_helper(L, NGX_[% SUBSYS %]_LUA_SHDICT_RIGHT); -} - - -static int -ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags) -{ - int n; - ngx_str_t name; - ngx_str_t key; + int n, value_type; + double num; uint32_t hash; + ngx_str_t name, key, value; ngx_int_t rc; - ngx_str_t value; - int value_type; - double num; ngx_rbtree_node_t *node; ngx_shm_zone_t *zone; ngx_queue_t *queue; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; - ngx_[% subsys %]_lua_shdict_list_node_t *lnode; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_list_node_t *lnode; n = lua_gettop(L); @@ -1035,7 +1063,7 @@ ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags) return luaL_error(L, "bad \"zone\" argument"); } - zone = ngx_[% subsys %]_lua_shdict_get_zone(L, 1); + zone = ngx_meta_lua_shdict_get_zone(L, 1); if (zone == NULL) { return luaL_error(L, "bad \"zone\" argument"); } @@ -1068,10 +1096,10 @@ ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags) ngx_shmtx_lock(&ctx->shpool->mutex); #if 1 - ngx_[% subsys %]_lua_shdict_expire(ctx, 1); + ngx_meta_lua_shdict_expire(ctx, 1); #endif - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key.data, key.len, &sd); + rc = ngx_meta_lua_shdict_lookup(zone, hash, key.data, key.len, &sd); dd("shdict lookup returned %d", (int) rc); @@ -1099,16 +1127,16 @@ ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags) (unsigned long) sd->value_len); } - queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, key.len); + queue = ngx_meta_lua_shdict_get_list_head(sd, key.len); - if (flags == NGX_[% SUBSYS %]_LUA_SHDICT_LEFT) { + if (flags == NGX_META_LUA_SHDICT_LEFT) { queue = ngx_queue_head(queue); } else { queue = ngx_queue_last(queue); } - lnode = ngx_queue_data(queue, ngx_[% subsys %]_lua_shdict_list_node_t, queue); + lnode = ngx_queue_data(queue, ngx_meta_lua_shdict_list_node_t, queue); value_type = lnode->value_type; @@ -1156,7 +1184,7 @@ ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags) if (sd->value_len == 1) { - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict list: empty node after pop, " "remove it"); @@ -1183,16 +1211,15 @@ ngx_[% subsys %]_lua_shdict_pop_helper(lua_State *L, int flags) static int -ngx_[% subsys %]_lua_shdict_llen(lua_State *L) +ngx_meta_lua_shdict_llen(lua_State *L) { int n; - ngx_str_t key; uint32_t hash; + ngx_str_t key; ngx_int_t rc; ngx_shm_zone_t *zone; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; n = lua_gettop(L); @@ -1205,7 +1232,7 @@ ngx_[% subsys %]_lua_shdict_llen(lua_State *L) return luaL_error(L, "bad \"zone\" argument"); } - zone = ngx_[% subsys %]_lua_shdict_get_zone(L, 1); + zone = ngx_meta_lua_shdict_get_zone(L, 1); if (zone == NULL) { return luaL_error(L, "bad \"zone\" argument"); } @@ -1237,10 +1264,10 @@ ngx_[% subsys %]_lua_shdict_llen(lua_State *L) ngx_shmtx_lock(&ctx->shpool->mutex); #if 1 - ngx_[% subsys %]_lua_shdict_expire(ctx, 1); + ngx_meta_lua_shdict_expire(ctx, 1); #endif - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key.data, key.len, &sd); + rc = ngx_meta_lua_shdict_lookup(zone, hash, key.data, key.len, &sd); dd("shdict lookup returned %d", (int) rc); @@ -1270,50 +1297,41 @@ ngx_[% subsys %]_lua_shdict_llen(lua_State *L) } -ngx_shm_zone_t * -ngx_[% subsys %]_lua_find_zone(u_char *name_data, size_t name_len) +#if (NGX_DEBUG) +static int +ngx_meta_lua_shdict_get_info(lua_State *L) { - ngx_str_t *name; - ngx_uint_t i; - ngx_shm_zone_t *zone; - volatile ngx_list_part_t *part; - - ngx_[% subsys %]_lua_shm_zone_ctx_t *ctx; + ngx_int_t n; + ngx_shm_zone_t *zone; + ngx_meta_lua_shdict_ctx_t *ctx; - part = &ngx_cycle->shared_memory.part; - zone = part->elts; - - for (i = 0; /* void */ ; i++) { + n = lua_gettop(L); - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } + if (n != 1) { + return luaL_error(L, "expecting exactly one argument, but seen %d", n); + } - part = part->next; - zone = part->elts; - i = 0; - } + luaL_checktype(L, 1, LUA_TTABLE); - name = &zone[i].shm.name; + zone = ngx_meta_lua_shdict_get_zone(L, 1); + if (zone == NULL) { + return luaL_error(L, "bad \"zone\" argument"); + } - dd("name: [% "[%" %].*s] %d", (int) name->len, name->data, (int) name->len); - dd("name2: [% "[%" %].*s] %d", (int) name_len, name_data, (int) name_len); + ctx = (ngx_meta_lua_shdict_ctx_t *) zone->data; - if (name->len == name_len - && ngx_strncmp(name->data, name_data, name_len) == 0) - { - ctx = (ngx_[% subsys %]_lua_shm_zone_ctx_t *) zone[i].data; - return &ctx->zone; - } - } + lua_pushlstring(L, (char *) zone->shm.name.data, zone->shm.name.len); + lua_pushnumber(L, zone->shm.size); + lua_pushboolean(L, ctx->isinit); + lua_pushboolean(L, ctx->isold); - return NULL; + return 4; } +#endif ngx_shm_zone_t * -ngx_[% subsys %]_lua_ffi_shdict_udata_to_zone(void *zone_udata) +ngx_meta_lua_ffi_shdict_udata_to_zone(void *zone_udata) { if (zone_udata == NULL) { return NULL; @@ -1324,21 +1342,20 @@ ngx_[% subsys %]_lua_ffi_shdict_udata_to_zone(void *zone_udata) int -ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, +ngx_meta_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, size_t key_len, int value_type, u_char *str_value_buf, size_t str_value_len, double num_value, long exptime, int user_flags, char **errmsg, int *forcible) { int i, n; - u_char c, *p; uint32_t hash; + u_char c, *p; ngx_int_t rc; ngx_time_t *tp; ngx_queue_t *queue, *q; ngx_rbtree_node_t *node; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; dd("exptime: %ld", exptime); @@ -1367,7 +1384,7 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, break; case LUA_TNIL: - if (op & (NGX_[% SUBSYS %]_LUA_SHDICT_ADD|NGX_[% SUBSYS %]_LUA_SHDICT_REPLACE)) { + if (op & (NGX_META_LUA_SHDICT_ADD|NGX_META_LUA_SHDICT_REPLACE)) { *errmsg = "attempt to add or replace nil values"; return NGX_ERROR; } @@ -1384,14 +1401,14 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, ngx_shmtx_lock(&ctx->shpool->mutex); #if 1 - ngx_[% subsys %]_lua_shdict_expire(ctx, 1); + ngx_meta_lua_shdict_expire(ctx, 1); #endif - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key, key_len, &sd); + rc = ngx_meta_lua_shdict_lookup(zone, hash, key, key_len, &sd); dd("lookup returns %d", (int) rc); - if (op & NGX_[% SUBSYS %]_LUA_SHDICT_REPLACE) { + if (op & NGX_META_LUA_SHDICT_REPLACE) { if (rc == NGX_DECLINED || rc == NGX_DONE) { ngx_shmtx_unlock(&ctx->shpool->mutex); @@ -1404,7 +1421,7 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, goto replace; } - if (op & NGX_[% SUBSYS %]_LUA_SHDICT_ADD) { + if (op & NGX_META_LUA_SHDICT_ADD) { if (rc == NGX_OK) { ngx_shmtx_unlock(&ctx->shpool->mutex); @@ -1438,7 +1455,7 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, && sd->value_type != SHDICT_TLIST) { - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict set: found old entry and value " "size matched, reusing it"); @@ -1456,12 +1473,10 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, sd->expires = 0; } - sd->user_flags = user_flags; - - sd->value_len = (uint32_t) str_value_len; - dd("setting value type to %d", value_type); + sd->user_flags = user_flags; + sd->value_len = (uint32_t) str_value_len; sd->value_type = (uint8_t) value_type; p = ngx_copy(sd->data, key, key_len); @@ -1472,21 +1487,21 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, return NGX_OK; } - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict set: found old entry but value size " "NOT matched, removing it first"); remove: if (sd->value_type == SHDICT_TLIST) { - queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, key_len); + queue = ngx_meta_lua_shdict_get_list_head(sd, key_len); for (q = ngx_queue_head(queue); q != ngx_queue_sentinel(queue); q = ngx_queue_next(q)) { p = (u_char *) ngx_queue_data(q, - ngx_[% subsys %]_lua_shdict_list_node_t, + ngx_meta_lua_shdict_list_node_t, queue); ngx_slab_free_locked(ctx->shpool, p); @@ -1513,11 +1528,11 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, return NGX_OK; } - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict set: creating a new entry"); n = offsetof(ngx_rbtree_node_t, color) - + offsetof(ngx_[% subsys %]_lua_shdict_node_t, data) + + offsetof(ngx_meta_lua_shdict_node_t, data) + key_len + str_value_len; @@ -1525,20 +1540,20 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, if (node == NULL) { - if (op & NGX_[% SUBSYS %]_LUA_SHDICT_SAFE_STORE) { + if (op & NGX_META_LUA_SHDICT_SAFE_STORE) { ngx_shmtx_unlock(&ctx->shpool->mutex); *errmsg = "no memory"; return NGX_ERROR; } - ngx_log_debug2(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict set: overriding non-expired items " "due to memory shortage for entry \"%*s\"", key_len, key); for (i = 0; i < 30; i++) { - if (ngx_[% subsys %]_lua_shdict_expire(ctx, 0) == 0) { + if (ngx_meta_lua_shdict_expire(ctx, 0) == 0) { break; } @@ -1558,7 +1573,7 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, allocated: - sd = (ngx_[% subsys %]_lua_shdict_node_t *) &node->color; + sd = (ngx_meta_lua_shdict_node_t *) &node->color; node->key = hash; sd->key_len = (u_short) key_len; @@ -1589,18 +1604,16 @@ ngx_[% subsys %]_lua_ffi_shdict_store(ngx_shm_zone_t *zone, int op, u_char *key, int -ngx_[% subsys %]_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key, +ngx_meta_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key, size_t key_len, int *value_type, u_char **str_value_buf, size_t *str_value_len, double *num_value, int *user_flags, int get_stale, int *is_stale, char **err) { - ngx_str_t name; uint32_t hash; + ngx_str_t name, value; ngx_int_t rc; - ngx_str_t value; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; *err = NULL; @@ -1610,20 +1623,20 @@ ngx_[% subsys %]_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key, hash = ngx_crc32_short(key, key_len); #if (NGX_DEBUG) - ngx_log_debug3(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug3(NGX_LOG_DEBUG_CORE, ctx->log, 0, "fetching key \"%*s\" in shared dict \"%V\"", key_len, key, &name); -#endif /* NGX_DEBUG */ +#endif ngx_shmtx_lock(&ctx->shpool->mutex); #if 1 if (!get_stale) { - ngx_[% subsys %]_lua_shdict_expire(ctx, 1); + ngx_meta_lua_shdict_expire(ctx, 1); } #endif - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key, key_len, &sd); + rc = ngx_meta_lua_shdict_lookup(zone, hash, key, key_len, &sd); dd("shdict lookup returns %d", (int) rc); @@ -1729,21 +1742,20 @@ ngx_[% subsys %]_lua_ffi_shdict_get(ngx_shm_zone_t *zone, u_char *key, int -ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, +ngx_meta_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, size_t key_len, double *value, char **err, int has_init, double init, long init_ttl, int *forcible) { int i, n; uint32_t hash; + double num; + u_char *p; ngx_int_t rc; ngx_time_t *tp = NULL; - double num; ngx_rbtree_node_t *node; - u_char *p; ngx_queue_t *queue, *q; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; if (init_ttl > 0) { tp = ngx_timeofday(); @@ -1760,9 +1772,9 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, ngx_shmtx_lock(&ctx->shpool->mutex); #if 1 - ngx_[% subsys %]_lua_shdict_expire(ctx, 1); + ngx_meta_lua_shdict_expire(ctx, 1); #endif - rc = ngx_[% subsys %]_lua_shdict_lookup(zone, hash, key, key_len, &sd); + rc = ngx_meta_lua_shdict_lookup(zone, hash, key, key_len, &sd); dd("shdict lookup returned %d", (int) rc); @@ -1783,7 +1795,7 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, if ((size_t) sd->value_len == sizeof(double) && sd->value_type != SHDICT_TLIST) { - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict incr: found old entry and " "value size matched, reusing it"); @@ -1829,18 +1841,18 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, remove: - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict incr: found old entry but value size " "NOT matched, removing it first"); if (sd->value_type == SHDICT_TLIST) { - queue = ngx_[% subsys %]_lua_shdict_get_list_head(sd, key_len); + queue = ngx_meta_lua_shdict_get_list_head(sd, key_len); for (q = ngx_queue_head(queue); q != ngx_queue_sentinel(queue); q = ngx_queue_next(q)) { - p = (u_char *) ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_list_node_t, + p = (u_char *) ngx_queue_data(q, ngx_meta_lua_shdict_list_node_t, queue); ngx_slab_free_locked(ctx->shpool, p); @@ -1858,11 +1870,11 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, insert: - ngx_log_debug0(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug0(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict incr: creating a new entry"); n = offsetof(ngx_rbtree_node_t, color) - + offsetof(ngx_[% subsys %]_lua_shdict_node_t, data) + + offsetof(ngx_meta_lua_shdict_node_t, data) + key_len + sizeof(double); @@ -1870,13 +1882,13 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, if (node == NULL) { - ngx_log_debug2(NGX_LOG_DEBUG_[% SUBSYS %], ctx->log, 0, + ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0, "lua shared dict incr: overriding non-expired items " "due to memory shortage for entry \"%*s\"", key_len, key); for (i = 0; i < 30; i++) { - if (ngx_[% subsys %]_lua_shdict_expire(ctx, 0) == 0) { + if (ngx_meta_lua_shdict_expire(ctx, 0) == 0) { break; } @@ -1896,12 +1908,11 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, allocated: - sd = (ngx_[% subsys %]_lua_shdict_node_t *) &node->color; + sd = (ngx_meta_lua_shdict_node_t *) &node->color; node->key = hash; sd->key_len = (u_short) key_len; - sd->value_len = (uint32_t) sizeof(double); ngx_rbtree_insert(&ctx->sh->rbtree, node); @@ -1930,17 +1941,17 @@ ngx_[% subsys %]_lua_ffi_shdict_incr(ngx_shm_zone_t *zone, u_char *key, ngx_shmtx_unlock(&ctx->shpool->mutex); *value = num; + return NGX_OK; } int -ngx_[% subsys %]_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone) +ngx_meta_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone) { ngx_queue_t *q; - - ngx_[% subsys %]_lua_shdict_node_t *sd; - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; ctx = zone->data; @@ -1950,11 +1961,11 @@ ngx_[% subsys %]_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone) q != ngx_queue_sentinel(&ctx->sh->lru_queue); q = ngx_queue_next(q)) { - sd = ngx_queue_data(q, ngx_[% subsys %]_lua_shdict_node_t, queue); + sd = ngx_queue_data(q, ngx_meta_lua_shdict_node_t, queue); sd->expires = 1; } - ngx_[% subsys %]_lua_shdict_expire(ctx, 0); + ngx_meta_lua_shdict_expire(ctx, 0); ngx_shmtx_unlock(&ctx->shpool->mutex); @@ -1963,14 +1974,13 @@ ngx_[% subsys %]_lua_ffi_shdict_flush_all(ngx_shm_zone_t *zone) static ngx_int_t -ngx_[% subsys %]_lua_shdict_peek(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, - u_char *kdata, size_t klen, ngx_[% subsys %]_lua_shdict_node_t **sdp) +ngx_meta_lua_shdict_peek(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, + u_char *kdata, size_t klen, ngx_meta_lua_shdict_node_t **sdp) { ngx_int_t rc; ngx_rbtree_node_t *node, *sentinel; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; ctx = shm_zone->data; @@ -1991,7 +2001,7 @@ ngx_[% subsys %]_lua_shdict_peek(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, /* hash == node->key */ - sd = (ngx_[% subsys %]_lua_shdict_node_t *) &node->color; + sd = (ngx_meta_lua_shdict_node_t *) &node->color; rc = ngx_memn2cmp(kdata, sd->data, klen, (size_t) sd->key_len); @@ -2011,24 +2021,22 @@ ngx_[% subsys %]_lua_shdict_peek(ngx_shm_zone_t *shm_zone, ngx_uint_t hash, long -ngx_[% subsys %]_lua_ffi_shdict_get_ttl(ngx_shm_zone_t *zone, u_char *key, +ngx_meta_lua_ffi_shdict_get_ttl(ngx_shm_zone_t *zone, u_char *key, size_t key_len) { uint32_t hash; - uint64_t now; - uint64_t expires; + uint64_t now, expires; ngx_int_t rc; ngx_time_t *tp; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; ctx = zone->data; hash = ngx_crc32_short(key, key_len); ngx_shmtx_lock(&ctx->shpool->mutex); - rc = ngx_[% subsys %]_lua_shdict_peek(zone, hash, key, key_len, &sd); + rc = ngx_meta_lua_shdict_peek(zone, hash, key, key_len, &sd); if (rc == NGX_DECLINED) { ngx_shmtx_unlock(&ctx->shpool->mutex); @@ -2054,15 +2062,14 @@ ngx_[% subsys %]_lua_ffi_shdict_get_ttl(ngx_shm_zone_t *zone, u_char *key, int -ngx_[% subsys %]_lua_ffi_shdict_set_expire(ngx_shm_zone_t *zone, u_char *key, +ngx_meta_lua_ffi_shdict_set_expire(ngx_shm_zone_t *zone, u_char *key, size_t key_len, long exptime) { uint32_t hash; ngx_int_t rc; ngx_time_t *tp = NULL; - - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ngx_[% subsys %]_lua_shdict_node_t *sd; + ngx_meta_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_node_t *sd; if (exptime > 0) { tp = ngx_timeofday(); @@ -2073,7 +2080,7 @@ ngx_[% subsys %]_lua_ffi_shdict_set_expire(ngx_shm_zone_t *zone, u_char *key, ngx_shmtx_lock(&ctx->shpool->mutex); - rc = ngx_[% subsys %]_lua_shdict_peek(zone, hash, key, key_len, &sd); + rc = ngx_meta_lua_shdict_peek(zone, hash, key, key_len, &sd); if (rc == NGX_DECLINED) { ngx_shmtx_unlock(&ctx->shpool->mutex); @@ -2098,7 +2105,7 @@ ngx_[% subsys %]_lua_ffi_shdict_set_expire(ngx_shm_zone_t *zone, u_char *key, size_t -ngx_[% subsys %]_lua_ffi_shdict_capacity(ngx_shm_zone_t *zone) +ngx_meta_lua_ffi_shdict_capacity(ngx_shm_zone_t *zone) { return zone->shm.size; } @@ -2106,11 +2113,11 @@ ngx_[% subsys %]_lua_ffi_shdict_capacity(ngx_shm_zone_t *zone) #if defined(nginx_version) && nginx_version >= 1011007 size_t -ngx_[% subsys %]_lua_ffi_shdict_free_space(ngx_shm_zone_t *zone) +ngx_meta_lua_ffi_shdict_free_space(ngx_shm_zone_t *zone) { size_t bytes; - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; + ngx_meta_lua_shdict_ctx_t *ctx; ctx = zone->data; diff --git a/src/meta/ngx_meta_lua_shdict.h b/src/meta/ngx_meta_lua_shdict.h new file mode 100644 index 0000000..08ccaf9 --- /dev/null +++ b/src/meta/ngx_meta_lua_shdict.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) Yichun Zhang (agentzh) + */ + + +#ifndef _NGX_META_LUA_SHDICT_H_INCLUDED_ +#define _NGX_META_LUA_SHDICT_H_INCLUDED_ + + +#include "ngx_meta_lua_module.h" + + +typedef struct { + u_char color; + uint8_t value_type; + u_short key_len; + uint32_t value_len; + uint64_t expires; + ngx_queue_t queue; + uint32_t user_flags; + u_char data[1]; +} ngx_meta_lua_shdict_node_t; + + +typedef struct { + ngx_queue_t queue; + uint32_t value_len; + uint8_t value_type; + u_char data[1]; +} ngx_meta_lua_shdict_list_node_t; + + +typedef struct { + ngx_rbtree_t rbtree; + ngx_rbtree_node_t sentinel; + ngx_queue_t lru_queue; +} ngx_meta_lua_shdict_shctx_t; + + +typedef struct { +#if (NGX_DEBUG) + ngx_int_t isold; + ngx_int_t isinit; +#endif + ngx_str_t name; + ngx_meta_lua_shdict_shctx_t *sh; + ngx_slab_pool_t *shpool; + ngx_meta_lua_conf_t *mcf; + ngx_log_t *log; +} ngx_meta_lua_shdict_ctx_t; + + +typedef struct { + ngx_shm_zone_t zone; + ngx_cycle_t *cycle; + ngx_meta_lua_conf_t *mcf; + ngx_log_t *log; +} ngx_meta_lua_shm_zone_ctx_t; + + +char *ngx_meta_lua_shdict_directive(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +#endif /* _NGX_META_LUA_SHDICT_H_INCLUDED_ */ + + +/* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/subsys/api/ngx_subsys_lua_api.h.tt2 b/src/subsys/api/ngx_subsys_lua_api.h.tt2 index 081e5c2..1d71aa4 100644 --- a/src/subsys/api/ngx_subsys_lua_api.h.tt2 +++ b/src/subsys/api/ngx_subsys_lua_api.h.tt2 @@ -57,15 +57,6 @@ lua_State *ngx_[% subsys %]_lua_get_global_state(ngx_conf_t *cf); ngx_int_t ngx_[% subsys %]_lua_add_package_preload(ngx_conf_t *cf, const char *package, lua_CFunction func); -ngx_int_t ngx_[% subsys %]_lua_shared_dict_get(ngx_shm_zone_t *shm_zone, - u_char *key_data, size_t key_len, ngx_[% subsys %]_lua_value_t *value); - -ngx_shm_zone_t *ngx_[% subsys %]_lua_find_zone(u_char *name_data, - size_t name_len); - -ngx_shm_zone_t *ngx_[% subsys %]_lua_shared_memory_add(ngx_conf_t *cf, - ngx_str_t *name, size_t size, void *tag); - #endif /* _NGX_[% SUBSYS %]_LUA_API_H_INCLUDED_ */ diff --git a/src/subsys/ngx_subsys_lua_api.c.tt2 b/src/subsys/ngx_subsys_lua_api.c.tt2 index d12d98f..622132f 100644 --- a/src/subsys/ngx_subsys_lua_api.c.tt2 +++ b/src/subsys/ngx_subsys_lua_api.c.tt2 @@ -12,7 +12,6 @@ #include "ngx_[% subsys %]_lua_common.h" #include "api/ngx_[% subsys %]_lua_api.h" -#include "ngx_[% subsys %]_lua_shdict.h" #include "ngx_[% subsys %]_lua_util.h" @@ -34,10 +33,6 @@ ngx_[% subsys %]_lua_get_request(lua_State *L) } -static ngx_int_t ngx_[% subsys %]_lua_shared_memory_init(ngx_shm_zone_t *shm_zone, - void *data); - - ngx_int_t ngx_[% subsys %]_lua_add_package_preload(ngx_conf_t *cf, const char *package, lua_CFunction func) @@ -84,135 +79,4 @@ ngx_[% subsys %]_lua_add_package_preload(ngx_conf_t *cf, const char *package, } -ngx_shm_zone_t * -ngx_[% subsys %]_lua_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, - size_t size, void *tag) -{ - ngx_[% subsys %]_lua_main_conf_t *lmcf; - ngx_[% subsys %]_lua_shm_zone_ctx_t *ctx; - - ngx_shm_zone_t **zp; - ngx_shm_zone_t *zone; - ngx_int_t n; - - lmcf = ngx_[% subsys %]_conf_get_module_main_conf(cf, ngx_[% subsys %]_lua_module); - if (lmcf == NULL) { - return NULL; - } - - if (lmcf->shm_zones == NULL) { - lmcf->shm_zones = ngx_palloc(cf->pool, sizeof(ngx_array_t)); - if (lmcf->shm_zones == NULL) { - return NULL; - } - - if (ngx_array_init(lmcf->shm_zones, cf->pool, 2, - sizeof(ngx_shm_zone_t *)) - != NGX_OK) - { - return NULL; - } - } - - zone = ngx_shared_memory_add(cf, name, (size_t) size, tag); - if (zone == NULL) { - return NULL; - } - - if (zone->data) { - ctx = (ngx_[% subsys %]_lua_shm_zone_ctx_t *) zone->data; - return &ctx->zone; - } - - n = sizeof(ngx_[% subsys %]_lua_shm_zone_ctx_t); - - ctx = ngx_pcalloc(cf->pool, n); - if (ctx == NULL) { - return NULL; - } - - ctx->lmcf = lmcf; - ctx->log = &cf->cycle->new_log; - ctx->cycle = cf->cycle; - - ngx_memcpy(&ctx->zone, zone, sizeof(ngx_shm_zone_t)); - - zp = ngx_array_push(lmcf->shm_zones); - if (zp == NULL) { - return NULL; - } - - *zp = zone; - - /* set zone init */ - zone->init = ngx_[% subsys %]_lua_shared_memory_init; - zone->data = ctx; - - lmcf->requires_shm = 1; - - return &ctx->zone; -} - - -static ngx_int_t -ngx_[% subsys %]_lua_shared_memory_init(ngx_shm_zone_t *shm_zone, void *data) -{ - ngx_[% subsys %]_lua_shm_zone_ctx_t *octx = data; - ngx_[% subsys %]_lua_main_conf_t *lmcf; - ngx_[% subsys %]_lua_shm_zone_ctx_t *ctx; - - ngx_shm_zone_t *ozone; - void *odata; - ngx_int_t rc; - volatile ngx_cycle_t *saved_cycle; - ngx_shm_zone_t *zone; - - ctx = (ngx_[% subsys %]_lua_shm_zone_ctx_t *) shm_zone->data; - zone = &ctx->zone; - - odata = NULL; - if (octx) { - ozone = &octx->zone; - odata = ozone->data; - } - - zone->shm = shm_zone->shm; -#if defined(nginx_version) && nginx_version >= 1009000 - zone->noreuse = shm_zone->noreuse; -#endif - - if (zone->init(zone, odata) != NGX_OK) { - return NGX_ERROR; - } - - dd("get lmcf"); - - lmcf = ctx->lmcf; - if (lmcf == NULL) { - return NGX_ERROR; - } - - dd("lmcf->lua: %p", lmcf->lua); - - lmcf->shm_zones_inited++; - - if (lmcf->shm_zones_inited == lmcf->shm_zones->nelts - && lmcf->init_handler && !ngx_test_config) - { - saved_cycle = ngx_cycle; - ngx_cycle = ctx->cycle; - - rc = lmcf->init_handler(ctx->log, lmcf, lmcf->lua); - - ngx_cycle = saved_cycle; - - if (rc != NGX_OK) { - /* an error happened */ - return NGX_ERROR; - } - } - - return NGX_OK; -} - /* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/subsys/ngx_subsys_lua_common.h.tt2 b/src/subsys/ngx_subsys_lua_common.h.tt2 index e170630..54843d7 100644 --- a/src/subsys/ngx_subsys_lua_common.h.tt2 +++ b/src/subsys/ngx_subsys_lua_common.h.tt2 @@ -24,6 +24,9 @@ #include +#include "ngx_meta_lua_api.h" + + [% IF stream_subsys %] #include "ngx_stream_lua_request.h" [% END %] @@ -52,6 +55,11 @@ #endif +#if !defined(ngx_meta_lua_version) || ngx_meta_lua_version < 00001 +# error ngx_meta_lua_module 0.0.1 or above is required +#endif + + [% IF http_subsys %] #if defined(NDK) && NDK #include @@ -204,8 +212,6 @@ typedef struct ngx_[% subsys %]_lua_balancer_peer_data_s typedef struct ngx_[% subsys %]_lua_sema_mm_s ngx_[% subsys %]_lua_sema_mm_t; -typedef ngx_int_t (*ngx_[% subsys %]_lua_main_conf_handler_pt)(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L); typedef ngx_int_t (*ngx_[% subsys %]_lua_srv_conf_handler_pt)( [% req_type %] *r, ngx_[% subsys %]_lua_srv_conf_t *lscf, lua_State *L); @@ -245,10 +251,6 @@ struct ngx_[% subsys %]_lua_main_conf_s { #endif - ngx_array_t *shm_zones; /* of ngx_shm_zone_t* */ - - ngx_array_t *shdict_zones; /* shm zones of "shdict" */ - ngx_array_t *preload_hooks; /* of ngx_[% subsys %]_lua_preload_hook_t */ [% IF http_subsys %] @@ -259,10 +261,10 @@ struct ngx_[% subsys %]_lua_main_conf_s { ngx_flag_t postponed_to_preread_phase_end; [% END %] - ngx_[% subsys %]_lua_main_conf_handler_pt init_handler; + ngx_meta_lua_main_conf_handler_pt init_handler; ngx_str_t init_src; - ngx_[% subsys %]_lua_main_conf_handler_pt init_worker_handler; + ngx_meta_lua_main_conf_handler_pt init_worker_handler; ngx_str_t init_worker_src; ngx_[% subsys %]_lua_balancer_peer_data_t *balancer_peer_data; @@ -295,8 +297,6 @@ struct ngx_[% subsys %]_lua_main_conf_s { */ [% END %] - ngx_uint_t shm_zones_inited; - ngx_[% subsys %]_lua_sema_mm_t *sema_mm; ngx_uint_t malloc_trim_cycle; /* a cycle is defined as the number @@ -327,7 +327,6 @@ struct ngx_[% subsys %]_lua_main_conf_s { [% END %] unsigned requires_log:1; - unsigned requires_shm:1; unsigned requires_capture_log:1; }; diff --git a/src/subsys/ngx_subsys_lua_directive.c.tt2 b/src/subsys/ngx_subsys_lua_directive.c.tt2 index c5e1b94..69050eb 100644 --- a/src/subsys/ngx_subsys_lua_directive.c.tt2 +++ b/src/subsys/ngx_subsys_lua_directive.c.tt2 @@ -19,7 +19,6 @@ #include "ngx_[% subsys %]_lua_logby.h" #include "ngx_[% subsys %]_lua_initby.h" #include "ngx_[% subsys %]_lua_initworkerby.h" -#include "ngx_[% subsys %]_lua_shdict.h" #include "ngx_[% subsys %]_lua_lex.h" #include "ngx_[% subsys %]_lua_log.h" #include "ngx_[% subsys %]_lua_log_ringbuf.h" @@ -78,90 +77,6 @@ enum { }; -char * -ngx_[% subsys %]_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_[% subsys %]_lua_main_conf_t *lmcf = conf; - ngx_str_t *value, name; - ngx_shm_zone_t *zone; - ngx_shm_zone_t **zp; - ngx_[% subsys %]_lua_shdict_ctx_t *ctx; - ssize_t size; - - if (lmcf->shdict_zones == NULL) { - lmcf->shdict_zones = ngx_palloc(cf->pool, sizeof(ngx_array_t)); - if (lmcf->shdict_zones == NULL) { - return NGX_CONF_ERROR; - } - - if (ngx_array_init(lmcf->shdict_zones, cf->pool, 2, - sizeof(ngx_shm_zone_t *)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - value = cf->args->elts; - - ctx = NULL; - - if (value[1].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid lua shared dict name \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - name = value[1]; - - size = ngx_parse_size(&value[2]); - - if (size <= 8191) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid lua shared dict size \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_[% subsys %]_lua_shdict_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - ctx->name = name; - ctx->main_conf = lmcf; - ctx->log = &cf->cycle->new_log; - - zone = ngx_[% subsys %]_lua_shared_memory_add(cf, &name, (size_t) size, - &ngx_[% subsys %]_lua_module); - if (zone == NULL) { - return NGX_CONF_ERROR; - } - - if (zone->data) { - ctx = zone->data; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "lua_shared_dict \"%V\" is already defined as " - "\"%V\"", &name, &ctx->name); - return NGX_CONF_ERROR; - } - - zone->init = ngx_[% subsys %]_lua_shdict_init_zone; - zone->data = ctx; - - zp = ngx_array_push(lmcf->shdict_zones); - if (zp == NULL) { - return NGX_CONF_ERROR; - } - - *zp = zone; - - lmcf->requires_shm = 1; - - return NGX_CONF_OK; -} - - char * ngx_[% subsys %]_lua_code_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { @@ -207,6 +122,15 @@ ngx_[% subsys %]_lua_load_resty_core(ngx_conf_t *cf, ngx_command_t *cmd, } +char * +ngx_[% subsys %]_lua_shdict_directive(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf) +{ + return ngx_meta_lua_shdict_directive_helper(cf, + &ngx_[% subsys %]_lua_module); +} + + char * ngx_[% subsys %]_lua_package_cpath(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { @@ -1333,7 +1257,7 @@ ngx_[% subsys %]_lua_init_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, return NGX_CONF_ERROR; } - lmcf->init_handler = (ngx_[% subsys %]_lua_main_conf_handler_pt) cmd->post; + lmcf->init_handler = (ngx_meta_lua_main_conf_handler_pt) cmd->post; if (cmd->post == ngx_[% subsys %]_lua_init_by_file) { name = ngx_[% subsys %]_lua_rebase_path(cf->pool, value[1].data, @@ -1394,7 +1318,7 @@ ngx_[% subsys %]_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, value = cf->args->elts; - lmcf->init_worker_handler = (ngx_[% subsys %]_lua_main_conf_handler_pt) cmd->post; + lmcf->init_worker_handler = (ngx_meta_lua_main_conf_handler_pt) cmd->post; if (cmd->post == ngx_[% subsys %]_lua_init_worker_by_file) { name = ngx_[% subsys %]_lua_rebase_path(cf->pool, value[1].data, diff --git a/src/subsys/ngx_subsys_lua_directive.h.tt2 b/src/subsys/ngx_subsys_lua_directive.h.tt2 index ba21ce4..aa9ba76 100644 --- a/src/subsys/ngx_subsys_lua_directive.h.tt2 +++ b/src/subsys/ngx_subsys_lua_directive.h.tt2 @@ -12,7 +12,7 @@ #include "ngx_[% subsys %]_lua_common.h" -char *ngx_[% subsys %]_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, +char *ngx_[% subsys %]_lua_shdict_directive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); char *ngx_[% subsys %]_lua_package_cpath(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); diff --git a/src/subsys/ngx_subsys_lua_initby.c.tt2 b/src/subsys/ngx_subsys_lua_initby.c.tt2 index 95104ed..0b4d9ae 100644 --- a/src/subsys/ngx_subsys_lua_initby.c.tt2 +++ b/src/subsys/ngx_subsys_lua_initby.c.tt2 @@ -14,13 +14,13 @@ ngx_int_t -ngx_[% subsys %]_lua_init_by_inline(ngx_log_t *log, ngx_[% subsys %]_lua_main_conf_t *lmcf, +ngx_[% subsys %]_lua_init_by_inline(ngx_log_t *log, ngx_str_t init_src, lua_State *L) { int status; - status = luaL_loadbuffer(L, (char *) lmcf->init_src.data, - lmcf->init_src.len, "=init_by_lua") + status = luaL_loadbuffer(L, (char *) init_src.data, init_src.len, + "=init_by_lua") || ngx_[% subsys %]_lua_do_call(log, L); return ngx_[% subsys %]_lua_report(log, L, status, "init_by_lua"); @@ -28,15 +28,16 @@ ngx_[% subsys %]_lua_init_by_inline(ngx_log_t *log, ngx_[% subsys %]_lua_main_co ngx_int_t -ngx_[% subsys %]_lua_init_by_file(ngx_log_t *log, ngx_[% subsys %]_lua_main_conf_t *lmcf, +ngx_[% subsys %]_lua_init_by_file(ngx_log_t *log, ngx_str_t init_src, lua_State *L) { int status; - status = luaL_loadfile(L, (char *) lmcf->init_src.data) + status = luaL_loadfile(L, (char *) init_src.data) || ngx_[% subsys %]_lua_do_call(log, L); return ngx_[% subsys %]_lua_report(log, L, status, "init_by_lua_file"); } + /* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/subsys/ngx_subsys_lua_initby.h.tt2 b/src/subsys/ngx_subsys_lua_initby.h.tt2 index 1f3a8fc..1d0d54e 100644 --- a/src/subsys/ngx_subsys_lua_initby.h.tt2 +++ b/src/subsys/ngx_subsys_lua_initby.h.tt2 @@ -12,10 +12,10 @@ ngx_int_t ngx_[% subsys %]_lua_init_by_inline(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L); + ngx_str_t init_src, lua_State *L); ngx_int_t ngx_[% subsys %]_lua_init_by_file(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L); + ngx_str_t init_src, lua_State *L); #endif /* _NGX_[% SUBSYS %]_LUA_INITBY_H_INCLUDED_ */ diff --git a/src/subsys/ngx_subsys_lua_initworkerby.c.tt2 b/src/subsys/ngx_subsys_lua_initworkerby.c.tt2 index d0dfa69..201a2b2 100644 --- a/src/subsys/ngx_subsys_lua_initworkerby.c.tt2 +++ b/src/subsys/ngx_subsys_lua_initworkerby.c.tt2 @@ -387,7 +387,8 @@ ngx_[% subsys %]_lua_init_worker(ngx_cycle_t *cycle) ngx_[% subsys %]_lua_set_req(lmcf->lua, r); - (void) lmcf->init_worker_handler(cycle->log, lmcf, lmcf->lua); + (void) lmcf->init_worker_handler(cycle->log, lmcf->init_worker_src, + lmcf->lua); ngx_destroy_pool(c->pool); return NGX_OK; @@ -408,12 +409,12 @@ failed: ngx_int_t ngx_[% subsys %]_lua_init_worker_by_inline(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L) + ngx_str_t init_worker_src, lua_State *L) { int status; - status = luaL_loadbuffer(L, (char *) lmcf->init_worker_src.data, - lmcf->init_worker_src.len, "=init_worker_by_lua") + status = luaL_loadbuffer(L, (char *) init_worker_src.data, + init_worker_src.len, "=init_worker_by_lua") || ngx_[% subsys %]_lua_do_call(log, L); return ngx_[% subsys %]_lua_report(log, L, status, "init_worker_by_lua"); @@ -422,11 +423,11 @@ ngx_[% subsys %]_lua_init_worker_by_inline(ngx_log_t *log, ngx_int_t ngx_[% subsys %]_lua_init_worker_by_file(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L) + ngx_str_t init_worker_src, lua_State *L) { int status; - status = luaL_loadfile(L, (char *) lmcf->init_worker_src.data) + status = luaL_loadfile(L, (char *) init_worker_src.data) || ngx_[% subsys %]_lua_do_call(log, L); return ngx_[% subsys %]_lua_report(log, L, status, "init_worker_by_lua_file"); diff --git a/src/subsys/ngx_subsys_lua_initworkerby.h.tt2 b/src/subsys/ngx_subsys_lua_initworkerby.h.tt2 index 196cf7f..9ee3574 100644 --- a/src/subsys/ngx_subsys_lua_initworkerby.h.tt2 +++ b/src/subsys/ngx_subsys_lua_initworkerby.h.tt2 @@ -12,10 +12,10 @@ ngx_int_t ngx_[% subsys %]_lua_init_worker_by_inline(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L); + ngx_str_t init_worker_src, lua_State *L); ngx_int_t ngx_[% subsys %]_lua_init_worker_by_file(ngx_log_t *log, - ngx_[% subsys %]_lua_main_conf_t *lmcf, lua_State *L); + ngx_str_t init_worker_src, lua_State *L); ngx_int_t ngx_[% subsys %]_lua_init_worker(ngx_cycle_t *cycle); diff --git a/src/subsys/ngx_subsys_lua_module.c.tt2 b/src/subsys/ngx_subsys_lua_module.c.tt2 index e701841..8d39be9 100644 --- a/src/subsys/ngx_subsys_lua_module.c.tt2 +++ b/src/subsys/ngx_subsys_lua_module.c.tt2 @@ -11,6 +11,7 @@ #include "ddebug.h" +#include "ngx_meta_lua_api.h" #include "ngx_[% subsys %]_lua_directive.h" #include "ngx_[% subsys %]_lua_contentby.h" #include "ngx_[% subsys %]_lua_util.h" @@ -122,7 +123,7 @@ static ngx_command_t ngx_[% subsys %]_lua_cmds[] = { { ngx_string("lua_shared_dict"), NGX_[% SUBSYS %]_MAIN_CONF|NGX_CONF_TAKE2, - ngx_[% subsys %]_lua_shared_dict, + ngx_[% subsys %]_lua_shdict_directive, 0, 0, NULL }, @@ -754,7 +755,6 @@ static ngx_int_t ngx_[% subsys %]_lua_init(ngx_conf_t *cf) { ngx_int_t rc; - volatile ngx_cycle_t *saved_cycle; ngx_array_t *arr; ngx_pool_cleanup_t *cln; @@ -955,18 +955,11 @@ ngx_[% subsys %]_lua_init(ngx_conf_t *cf) ngx_[% subsys %]_lua_assert(lmcf->lua != NULL); - if (!lmcf->requires_shm && lmcf->init_handler) { - saved_cycle = ngx_cycle; - ngx_cycle = cf->cycle; - - rc = lmcf->init_handler(cf->log, lmcf, lmcf->lua); - - ngx_cycle = saved_cycle; - - if (rc != NGX_OK) { - /* an error happened */ - return NGX_ERROR; - } + if (ngx_meta_lua_post_init_handler(cf, lmcf->init_handler, + lmcf->init_src, lmcf->lua) + != NGX_OK) + { + return NGX_ERROR; } dd("Lua VM initialized!"); @@ -1026,11 +1019,8 @@ ngx_[% subsys %]_lua_create_main_conf(ngx_conf_t *cf) * lmcf->watcher = NULL; * lmcf->regex_cache_entries = 0; * lmcf->jit_stack = NULL; - * lmcf->shm_zones = NULL; * lmcf->init_handler = NULL; * lmcf->init_src = { 0, NULL }; - * lmcf->shm_zones_inited = 0; - * lmcf->shdict_zones = NULL; * lmcf->preload_hooks = NULL; * lmcf->requires_header_filter = 0; * lmcf->requires_body_filter = 0; @@ -1038,7 +1028,6 @@ ngx_[% subsys %]_lua_create_main_conf(ngx_conf_t *cf) * lmcf->requires_rewrite = 0; * lmcf->requires_access = 0; * lmcf->requires_log = 0; - * lmcf->requires_shm = 0; */ lmcf->pool = cf->pool; diff --git a/src/subsys/ngx_subsys_lua_shdict.h.tt2 b/src/subsys/ngx_subsys_lua_shdict.h.tt2 deleted file mode 100644 index 5b0ae93..0000000 --- a/src/subsys/ngx_subsys_lua_shdict.h.tt2 +++ /dev/null @@ -1,67 +0,0 @@ - -/* - * Copyright (C) Yichun Zhang (agentzh) - */ - - -#ifndef _NGX_[% SUBSYS %]_LUA_SHDICT_H_INCLUDED_ -#define _NGX_[% SUBSYS %]_LUA_SHDICT_H_INCLUDED_ - - -#include "ngx_[% subsys %]_lua_common.h" - - -typedef struct { - u_char color; - uint8_t value_type; - u_short key_len; - uint32_t value_len; - uint64_t expires; - ngx_queue_t queue; - uint32_t user_flags; - u_char data[1]; -} ngx_[% subsys %]_lua_shdict_node_t; - - -typedef struct { - ngx_queue_t queue; - uint32_t value_len; - uint8_t value_type; - u_char data[1]; -} ngx_[% subsys %]_lua_shdict_list_node_t; - - -typedef struct { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_queue_t lru_queue; -} ngx_[% subsys %]_lua_shdict_shctx_t; - - -typedef struct { - ngx_[% subsys %]_lua_shdict_shctx_t *sh; - ngx_slab_pool_t *shpool; - ngx_str_t name; - ngx_[% subsys %]_lua_main_conf_t *main_conf; - ngx_log_t *log; -} ngx_[% subsys %]_lua_shdict_ctx_t; - - -typedef struct { - ngx_log_t *log; - ngx_[% subsys %]_lua_main_conf_t *lmcf; - ngx_cycle_t *cycle; - ngx_shm_zone_t zone; -} ngx_[% subsys %]_lua_shm_zone_ctx_t; - - -ngx_int_t ngx_[% subsys %]_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data); -void ngx_[% subsys %]_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -void ngx_[% subsys %]_lua_inject_shdict_api(ngx_[% subsys %]_lua_main_conf_t *lmcf, - lua_State *L); - - -#endif /* _NGX_[% SUBSYS %]_LUA_SHDICT_H_INCLUDED_ */ - -/* vi:set ft=c ts=4 sw=4 et fdm=marker: */ diff --git a/src/subsys/ngx_subsys_lua_util.c.tt2 b/src/subsys/ngx_subsys_lua_util.c.tt2 index 234cadf..9f838bd 100644 --- a/src/subsys/ngx_subsys_lua_util.c.tt2 +++ b/src/subsys/ngx_subsys_lua_util.c.tt2 @@ -12,6 +12,7 @@ #include "nginx.h" +#include "ngx_meta_lua_api.h" #include "ngx_[% subsys %]_lua_directive.h" #include "ngx_[% subsys %]_lua_util.h" #include "ngx_[% subsys %]_lua_exception.h" @@ -23,7 +24,6 @@ #include "ngx_[% subsys %]_lua_string.h" #include "ngx_[% subsys %]_lua_misc.h" #include "ngx_[% subsys %]_lua_consts.h" -#include "ngx_[% subsys %]_lua_shdict.h" #include "ngx_[% subsys %]_lua_coroutine.h" #include "ngx_[% subsys %]_lua_socket_tcp.h" #include "ngx_[% subsys %]_lua_socket_udp.h" @@ -129,7 +129,7 @@ static ngx_int_t ngx_[% subsys %]_lua_handle_exit(lua_State *L, static int ngx_[% subsys %]_lua_thread_traceback(lua_State *L, lua_State *co, ngx_[% subsys %]_lua_co_ctx_t *coctx); static void ngx_[% subsys %]_lua_inject_ngx_api(lua_State *L, - ngx_[% subsys %]_lua_main_conf_t *lmcf, ngx_log_t *log); + ngx_cycle_t *cycle, ngx_[% subsys %]_lua_main_conf_t *lmcf, ngx_log_t *log); static ngx_int_t ngx_[% subsys %]_lua_output_filter([% req_type %] *r, ngx_chain_t *in); static void ngx_[% subsys %]_lua_finalize_threads([% req_type %] *r, @@ -760,13 +760,13 @@ ngx_[% subsys %]_lua_init_globals(lua_State *L, ngx_cycle_t *cycle, #endif /* defined(NDK) && NDK */ [% END %] - ngx_[% subsys %]_lua_inject_ngx_api(L, lmcf, log); + ngx_[% subsys %]_lua_inject_ngx_api(L, cycle, lmcf, log); } static void -ngx_[% subsys %]_lua_inject_ngx_api(lua_State *L, ngx_[% subsys %]_lua_main_conf_t *lmcf, - ngx_log_t *log) +ngx_[% subsys %]_lua_inject_ngx_api(lua_State *L, ngx_cycle_t *cycle, + ngx_[% subsys %]_lua_main_conf_t *lmcf, ngx_log_t *log) { lua_createtable(L, 0 /* narr */, 113 /* nrec */); /* ngx.* */ @@ -802,7 +802,7 @@ ngx_[% subsys %]_lua_inject_ngx_api(lua_State *L, ngx_[% subsys %]_lua_main_conf ngx_[% subsys %]_lua_create_headers_metatable(log, L); [% END %] - ngx_[% subsys %]_lua_inject_shdict_api(lmcf, L); + ngx_meta_lua_inject_shdict_api(L, cycle, &ngx_[% subsys %]_lua_module); ngx_[% subsys %]_lua_inject_socket_tcp_api(log, L); ngx_[% subsys %]_lua_inject_socket_udp_api(log, L); ngx_[% subsys %]_lua_inject_uthread_api(log, L); diff --git a/src/subsys/ngx_subsys_lua_util.h.tt2 b/src/subsys/ngx_subsys_lua_util.h.tt2 index e9955ae..fb5757e 100644 --- a/src/subsys/ngx_subsys_lua_util.h.tt2 +++ b/src/subsys/ngx_subsys_lua_util.h.tt2 @@ -406,7 +406,9 @@ ngx_stream_lua_create_ctx(ngx_stream_session_t *r) ngx_[% subsys %]_lua_assert(L != NULL); if (lmcf->init_handler) { - if (lmcf->init_handler(r->connection->log, lmcf, L) != NGX_OK) { + if (lmcf->init_handler(r->connection->log, lmcf->init_src, L) + != NGX_OK) + { /* an error happened */ return NULL; } diff --git a/t/TestMeta.pm b/t/TestMeta.pm new file mode 100644 index 0000000..b58ecd1 --- /dev/null +++ b/t/TestMeta.pm @@ -0,0 +1,47 @@ +package t::TestMeta; + +use Test::Nginx::Socket::Lua -Base; +use Test::Nginx::Socket::Lua::Stream; +use Cwd qw(cwd); + +our $pwd = cwd(); + +our $lua_package_path = '../lua-resty-core/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;'; + +our $init_jit_settings = <<_EOC_; + local verbose = false + if verbose then + local dump = require "jit.dump" + dump.on("b", "$Test::Nginx::Util::ErrLogFile") + else + local v = require "jit.v" + v.on("$Test::Nginx::Util::ErrLogFile") + end + --jit.off() +_EOC_ + +our @EXPORT = qw( + $pwd + $lua_package_path + $init_jit_settings +); + +add_block_preprocessor(sub { + my $block = shift; + + if (!defined $block->config) { + $block->set_value("config", "location /t { return 200; }"); + } + + if (!defined $block->request) { + $block->set_value("request", "GET /t"); + } + + if (!defined $block->no_error_log && !defined $block->error_log + && !defined $block->grep_error_log) + { + $block->set_value("no_error_log", "[error]"); + } +}); + +1; diff --git a/t/meta/001-lua-block.t b/t/meta/001-lua-block.t new file mode 100644 index 0000000..289bd44 --- /dev/null +++ b/t/meta/001-lua-block.t @@ -0,0 +1,112 @@ +# vim:set ft= ts=4 sw=4 et fdm=marker: +use lib '.'; +use t::TestMeta; + +plan tests => repeat_each() * (blocks() * 2); + +add_block_preprocessor(sub { + my $block = shift; + + my $http_init_by_lua_block = $block->http_init_by_lua_block || ''; + my $stream_init_by_lua_block = $block->stream_init_by_lua_block || ''; + my $http_config = $block->http_config || ''; + my $stream_config = $block->stream_config || ''; + + $http_config .= <<_EOC_; + lua_package_path '$t::TestMeta::lua_package_path'; + init_by_lua_block { $http_init_by_lua_block } +_EOC_ + + $stream_config .= <<_EOC_; + lua_package_path '$t::TestMeta::lua_package_path'; + init_by_lua_block { $stream_init_by_lua_block } +_EOC_ + + $block->set_value("http_config", $http_config); + $block->set_value("stream_config", $stream_config); + $block->set_value("stream_server_config", <<_EOC_); + content_by_lua_block { ngx.say("ok") } +_EOC_ +}); + +no_long_string(); +run_tests(); + +__DATA__ + +=== TEST 1: lua{} block - sanity +--- main_config + lua {} +--- no_error_log +[error] + + + +=== TEST 2: lua{} block - duplicated block +--- main_config + lua {} + lua {} +--- must_die +--- error_log +"lua" directive is duplicate + + + +=== TEST 3: lua{} block - invalid context +--- http_config + lua {} +--- must_die +--- error_log +"lua" directive is not allowed here + + + +=== TEST 4: lua{} block - execute http{} init_by_lua +--- main_config + lua {} +--- http_init_by_lua_block +print("hello from http{} init_by_lua_block") +--- error_log +hello from http{} init_by_lua_block + + + +=== TEST 5: lua{} block - execute stream{} init_by_lua +--- main_config + lua {} +--- stream_init_by_lua_block +print("hello from stream{} init_by_lua_block") +--- error_log +hello from stream{} init_by_lua_block + + + +=== TEST 6: lua{} block - execute stream{} + http{} init_by_lua +--- main_config + lua {} +--- http_init_by_lua_block +print("hello from http{} init_by_lua_block") +--- stream_init_by_lua_block +print("hello from stream{} init_by_lua_block") +--- grep_error_log eval: qr/hello from (?:http|stream)\{\} init_by_lua_block/ +--- grep_error_log_out +hello from stream{} init_by_lua_block +hello from http{} init_by_lua_block + + + +=== TEST 7: lua{} block - execute stream{} + http{} delayed init_by_lua +--- main_config + lua { + lua_shared_dict shm 64k; + } +--- http_init_by_lua_block +print("hello from http{} init_by_lua_block") +--- stream_init_by_lua_block +print("hello from stream{} init_by_lua_block") +--- grep_error_log eval: qr/(?:hello from (?:http|stream)\{\} init_by_lua_block|lua run delayed init_handler: [0-9A-F]+)/ +--- grep_error_log_out eval +qr/lua run delayed init_handler: [0-9A-F]+ +hello from stream\{\} init_by_lua_block +lua run delayed init_handler: [0-9A-F]+ +hello from http\{\} init_by_lua_block/ diff --git a/t/meta/002-shdict.t b/t/meta/002-shdict.t new file mode 100644 index 0000000..ca90090 --- /dev/null +++ b/t/meta/002-shdict.t @@ -0,0 +1,164 @@ +# vim:set ft= ts=4 sw=4 et fdm=marker: +use lib '.'; +use t::TestMeta; + +plan tests => repeat_each() * (blocks() * 3); + +$ENV{TEST_NGINX_LUA_PACKAGE_PATH} = "$t::TestMeta::lua_package_path"; + +no_long_string(); +run_tests(); + +__DATA__ + +=== TEST 1: http{} - sanity +--- http_config + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; + lua_shared_dict dict 1m; +--- config + location = /t { + content_by_lua_block { + ngx.shared.dict:set("foo", 42) + ngx.say(ngx.shared.dict:get("foo")) + } + } +--- response_body +42 + + + +=== TEST 2: stream{} - sanity +--- stream_config + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; + lua_shared_dict dict 1m; +--- stream_server_config + content_by_lua_block { + ngx.shared.dict:set("foo", 42) + ngx.say(ngx.shared.dict:get("foo")) + } +--- response_body +42 + + + +=== TEST 3: http{} and stream{} - shdicts are isolated +--- stream_config + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; + lua_shared_dict stream_dict 1m; +--- stream_server_config + content_by_lua_block { + ngx.shared.stream_dict:set("foo", 42) + ngx.say("stream_dict: ", ngx.shared.stream_dict:get("foo")) + ngx.say("http_dict: ", tostring(ngx.shared.http_dict)) + } +--- http_config + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; + lua_shared_dict http_dict 1m; + + log_by_lua_block { + ngx.log(ngx.NOTICE, "in http stream_dict: ", + tostring(ngx.shared.stream_dict)) + } +--- response_body +stream_dict: 42 +http_dict: nil +--- error_log +in http stream_dict: nil + + + +=== TEST 4: lua{} - shdict is shared by all subsystems +--- main_config + lua { + lua_shared_dict dict 1m; + } +--- stream_config + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; +--- stream_server_config + content_by_lua_block { + ngx.say("from stream{}: ", ngx.shared.dict:get("key")) + ngx.shared.dict:set("key", "set from stream{}") + } +--- http_config + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; + access_by_lua_block { + ngx.shared.dict:set("key", "set from http{}") + } + + log_by_lua_block { + ngx.log(ngx.NOTICE, "from http{}: ", ngx.shared.dict:get("key")) + } +--- response_body +from stream{}: set from http{} +--- error_log +from http{}: set from stream{} + + + +=== TEST 5: lua{} and http{} - same shdict name is invalid +--- main_config + lua { + lua_shared_dict dict 1m; + } +--- http_config + lua_shared_dict dict 1m; + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; +--- ignore_response_body +--- must_die +--- error_log +the shared memory zone "dict" is already declared +--- no_error_log +[error] + + + +=== TEST 6: lua{} and stream{} - same shdict name is invalid +--- main_config + lua { + lua_shared_dict dict 1m; + } +--- stream_config + lua_shared_dict dict 1m; + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; +--- ignore_response_body +--- must_die +--- error_log +the shared memory zone "dict" is already declared +--- no_error_log +[error] + + + +=== TEST 7: sanity check on ngx.shared size for each Lua VM +--- main_config + lua { + lua_shared_dict d1 1m; + lua_shared_dict d2 1m; + } +--- stream_config + lua_shared_dict sd1 1m; + lua_shared_dict sd2 1m; + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; +--- stream_server_config + content_by_lua_block { + local n = 0 + for k in pairs(ngx.shared) do + n = n + 1 + end + ngx.say("stream ngx.shared nkeys: ", n) + } +--- http_config + lua_shared_dict hd1 1m; + lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH"; + + log_by_lua_block { + local n = 0 + for k in pairs(ngx.shared) do + n = n + 1 + end + ngx.log(ngx.NOTICE, "http ngx.shared nkeys: ", n) + } +--- response_body +stream ngx.shared nkeys: 4 +--- error_log +http ngx.shared nkeys: 3 diff --git a/valgrind.suppress b/valgrind.suppress new file mode 100644 index 0000000..7fff542 --- /dev/null +++ b/valgrind.suppress @@ -0,0 +1,209 @@ +{ + + Memcheck:Addr1 + fun:ngx_init_cycle + fun:ngx_master_process_cycle + fun:main +} +{ + + Memcheck:Addr4 + fun:ngx_init_cycle + fun:ngx_master_process_cycle + fun:main +} +{ + + Memcheck:Cond + fun:ngx_vslprintf + fun:ngx_snprintf + fun:ngx_sock_ntop + fun:ngx_event_accept + fun:ngx_epoll_process_events + fun:ngx_process_events_and_timers +} +{ + + Memcheck:Addr1 + fun:ngx_vslprintf + fun:ngx_snprintf + fun:ngx_sock_ntop + fun:ngx_event_accept +} +{ + + exp-sgcheck:SorG + fun:ngx_http_lua_ndk_set_var_get +} +{ + + exp-sgcheck:SorG + fun:ngx_http_variables_init_vars + fun:ngx_http_block +} +{ + + exp-sgcheck:SorG + fun:ngx_conf_parse +} +{ + + exp-sgcheck:SorG + fun:ngx_vslprintf + fun:ngx_log_error_core +} +{ + + Memcheck:Param + epoll_ctl(event) + fun:epoll_ctl +} +{ + + Memcheck:Cond + fun:ngx_conf_flush_files + fun:ngx_single_process_cycle +} +{ + + Memcheck:Cond + fun:memcpy + fun:ngx_vslprintf + fun:ngx_log_error_core + fun:ngx_http_charset_header_filter +} +{ + + Memcheck:Param + socketcall.setsockopt(optval) + fun:setsockopt + fun:drizzle_state_connect +} +{ + + Memcheck:Cond + fun:ngx_conf_flush_files + fun:ngx_single_process_cycle + fun:main +} +{ + + Memcheck:Leak + fun:malloc + fun:ngx_alloc + fun:ngx_event_process_init +} +{ + + Memcheck:Param + sendmsg(mmsg[0].msg_hdr) + fun:sendmmsg + fun:__libc_res_nsend +} +{ + + Memcheck:Param + sendmsg(msg.msg_iov[0]) + fun:__sendmsg_nocancel + fun:ngx_write_channel + fun:ngx_pass_open_channel + fun:ngx_start_cache_manager_processes +} +{ + + Memcheck:Cond + fun:ngx_init_cycle + fun:ngx_master_process_cycle + fun:main +} +{ + + Memcheck:Cond + fun:index + fun:expand_dynamic_string_token + fun:_dl_map_object + fun:map_doit + fun:_dl_catch_error + fun:do_preload + fun:dl_main + fun:_dl_sysdep_start + fun:_dl_start +} +{ + + Memcheck:Param + sendmsg(mmsg[0].msg_hdr) + fun:sendmmsg + fun:__libc_res_nsend + fun:__libc_res_nquery + fun:__libc_res_nquerydomain + fun:__libc_res_nsearch +} +{ + + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:ngx_alloc + fun:ngx_set_environment + fun:ngx_single_process_cycle +} +{ + + Memcheck:Cond + obj:* +} +{ + + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:ngx_alloc + fun:ngx_set_environment + fun:ngx_worker_process_init +} +{ + + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + fun:ngx_alloc + fun:ngx_create_pool + fun:main +} +{ + + Memcheck:Param + epoll_pwait(sigmask) + fun:epoll_pwait + fun:epoll_wait + fun:ngx_epoll_process_events + fun:ngx_process_events_and_timers +} +{ + + Memcheck:Param + epoll_pwait(sigmask) + fun:epoll_pwait + fun:epoll_wait + fun:ngx_epoll_test_rdhup + fun:ngx_epoll_init + fun:ngx_event_process_init +} +{ + + Memcheck:Param + epoll_pwait(sigmask) + fun:epoll_pwait + fun:ngx_epoll_process_events + fun:ngx_process_events_and_timers +} +{ + + Memcheck:Param + epoll_pwait(sigmask) + fun:epoll_pwait + fun:ngx_epoll_test_rdhup + fun:ngx_epoll_init + fun:ngx_event_process_init +}