From 76d1e6fa1fb42ff6f5d4a1ac3a196b460083bb74 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Fri, 6 May 2016 20:37:51 +0800 Subject: [PATCH] memory warning --- service-src/service_snlua.c | 24 +++++++++++++++++++++++- skynet-src/malloc_hook.c | 2 +- skynet-src/skynet_main.c | 2 +- skynet-src/skynet_malloc.h | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/service-src/service_snlua.c b/service-src/service_snlua.c index 20440780..bd2f6b2c 100644 --- a/service-src/service_snlua.c +++ b/service-src/service_snlua.c @@ -9,9 +9,13 @@ #include #include +#define MEMORY_WARNING_REPORT (1024 * 1024 * 32) + struct snlua { lua_State * L; struct skynet_context * ctx; + size_t mem; + size_t mem_report; }; // LUA_CACHELIB may defined in patched lua for shared proto @@ -144,11 +148,25 @@ snlua_init(struct snlua *l, struct skynet_context *ctx, const char * args) { return 0; } +static void * +lalloc(void * ud, void *ptr, size_t osize, size_t nsize) { + struct snlua *l = ud; + l->mem += nsize; + if (ptr) + l->mem -= osize; + if (l->mem > l->mem_report) { + l->mem_report *= 2; + skynet_error(l->ctx, "Memory warning %.2f M", (float)l->mem / (1024 * 1024)); + } + return skynet_lalloc(ptr, osize, nsize); +} + struct snlua * snlua_create(void) { struct snlua * l = skynet_malloc(sizeof(*l)); memset(l,0,sizeof(*l)); - l->L = lua_newstate(skynet_lalloc, NULL); + l->mem_report = MEMORY_WARNING_REPORT; + l->L = lua_newstate(lalloc, l); return l; } @@ -161,8 +179,12 @@ snlua_release(struct snlua *l) { void snlua_signal(struct snlua *l, int signal) { skynet_error(l->ctx, "recv a signal %d", signal); + if (signal == 0) { #ifdef lua_checksig // If our lua support signal (modified lua version by skynet), trigger it. skynet_sig_L = l->L; #endif + } else if (signal == 1) { + skynet_error(l->ctx, "Current Memory %.3fK", (float)l->mem / 1024); + } } diff --git a/skynet-src/malloc_hook.c b/skynet-src/malloc_hook.c index 6cad2a9a..da8a536b 100644 --- a/skynet-src/malloc_hook.c +++ b/skynet-src/malloc_hook.c @@ -227,7 +227,7 @@ skynet_strdup(const char *str) { } void * -skynet_lalloc(void *ud, void *ptr, size_t osize, size_t nsize) { +skynet_lalloc(void *ptr, size_t osize, size_t nsize) { if (nsize == 0) { raw_free(ptr); return NULL; diff --git a/skynet-src/skynet_main.c b/skynet-src/skynet_main.c index eb6f4429..f4296cd9 100644 --- a/skynet-src/skynet_main.c +++ b/skynet-src/skynet_main.c @@ -115,7 +115,7 @@ main(int argc, char *argv[]) { struct skynet_config config; - struct lua_State *L = lua_newstate(skynet_lalloc, NULL); + struct lua_State *L = luaL_newstate(); luaL_openlibs(L); // link lua lib int err = luaL_loadstring(L, load_config); diff --git a/skynet-src/skynet_malloc.h b/skynet-src/skynet_malloc.h index f7e4337f..7bafa406 100644 --- a/skynet-src/skynet_malloc.h +++ b/skynet-src/skynet_malloc.h @@ -13,6 +13,6 @@ void * skynet_calloc(size_t nmemb,size_t size); void * skynet_realloc(void *ptr, size_t size); void skynet_free(void *ptr); char * skynet_strdup(const char *str); -void * skynet_lalloc(void *ud, void *ptr, size_t osize, size_t nsize); // use for lua +void * skynet_lalloc(void *ptr, size_t osize, size_t nsize); // use for lua #endif