From 5eab3d7e22c3573f47cb0fff7222c7c2c3096036 Mon Sep 17 00:00:00 2001 From: EfveZombie <34877029+EfveZombie@users.noreply.github.com> Date: Wed, 21 May 2025 17:49:34 +0800 Subject: [PATCH] =?UTF-8?q?lua-skynet:=20lerror=20=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E7=AC=A6=E4=BD=BF=E7=94=A8=20"%*s",=20=E8=8A=82=E7=9C=81?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=20strlen=20(#2051)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lua-skynet: lerror 格式符使用 "%*s", 节省一次 strlen * make skynet_strdup/skynet_strndup static, remove skynet_asprintf/skynet_vasprintf --------- Co-authored-by: efve.zff --- lualib-src/lua-skynet.c | 15 ++++++---- skynet-src/malloc_hook.c | 8 ------ skynet-src/skynet_error.c | 59 ++++++++++++++++++++++---------------- skynet-src/skynet_handle.c | 16 +++++------ skynet-src/skynet_imp.h | 17 +++++++++++ skynet-src/skynet_malloc.h | 1 - skynet-src/skynet_module.c | 11 +++---- 7 files changed, 75 insertions(+), 52 deletions(-) diff --git a/lualib-src/lua-skynet.c b/lualib-src/lua-skynet.c index 811a4392..f3f7529c 100644 --- a/lualib-src/lua-skynet.c +++ b/lualib-src/lua-skynet.c @@ -207,7 +207,7 @@ lintcommand(lua_State *L) { result = skynet_command(context, cmd, parm); if (result) { - char *endptr = NULL; + char *endptr = NULL; lua_Integer r = strtoll(result, &endptr, 0); if (endptr == NULL || *endptr != '\0') { // may be real number @@ -340,8 +340,9 @@ lerror(lua_State *L) { int n = lua_gettop(L); if (n <= 1) { lua_settop(L, 1); - const char * s = luaL_tolstring(L, 1, NULL); - skynet_error(context, "%s", s); + size_t len; + const char *s = luaL_tolstring(L, 1, &len); + skynet_error(context, "%*s", (int)len, s); return 0; } luaL_Buffer b; @@ -355,7 +356,9 @@ lerror(lua_State *L) { } } luaL_pushresult(&b); - skynet_error(context, "%s", lua_tostring(L, -1)); + size_t len; + const char *s = luaL_tolstring(L, -1, &len); + skynet_error(context, "%*s", (int)len, s); return 0; } @@ -470,13 +473,13 @@ ltrace(lua_State *L) { skynet_error(context, " %" PRId64 " %s : %s:%d", tag, get_time(), user, si[0].source, si[0].line); break; case 2: - skynet_error(context, " %" PRId64 " %s : %s:%d %s:%d", tag, get_time(), user, + skynet_error(context, " %" PRId64 " %s : %s:%d %s:%d", tag, get_time(), user, si[0].source, si[0].line, si[1].source, si[1].line ); break; case 3: - skynet_error(context, " %" PRId64 " %s : %s:%d %s:%d %s:%d", tag, get_time(), user, + skynet_error(context, " %" PRId64 " %s : %s:%d %s:%d %s:%d", tag, get_time(), user, si[0].source, si[0].line, si[1].source, si[1].line, si[2].source, si[2].line diff --git a/skynet-src/malloc_hook.c b/skynet-src/malloc_hook.c index 9ec89755..bec7a2bf 100644 --- a/skynet-src/malloc_hook.c +++ b/skynet-src/malloc_hook.c @@ -323,14 +323,6 @@ dump_c_mem() { skynet_error(NULL, "+total: %zdkb",total >> 10); } -char * -skynet_strdup(const char *str) { - size_t sz = strlen(str); - char * ret = skynet_malloc(sz+1); - memcpy(ret, str, sz+1); - return ret; -} - void * skynet_lalloc(void *ptr, size_t osize, size_t nsize) { if (nsize == 0) { diff --git a/skynet-src/skynet_error.c b/skynet-src/skynet_error.c index 856c4700..9552e270 100644 --- a/skynet-src/skynet_error.c +++ b/skynet-src/skynet_error.c @@ -1,16 +1,35 @@ #include "skynet.h" #include "skynet_handle.h" +#include "skynet_imp.h" #include "skynet_mq.h" #include "skynet_server.h" #include #include -#include #include #define LOG_MESSAGE_SIZE 256 -void +static int +log_try_vasprintf(char **strp, const char *fmt, va_list ap) { + if (strcmp(fmt, "%*s") == 0) { + // for `lerror` in lua-skynet.c + const int len = va_arg(ap, int); + const char *tmp = va_arg(ap, const char*); + *strp = skynet_strndup(tmp, len); + return *strp != NULL ? len : -1; + } + + char tmp[LOG_MESSAGE_SIZE]; + int len = vsnprintf(tmp, LOG_MESSAGE_SIZE, fmt, ap); + if (len >= 0 && len < LOG_MESSAGE_SIZE) { + *strp = skynet_strndup(tmp, len); + if (*strp == NULL) return -1; + } + return len; +} + +void skynet_error(struct skynet_context * context, const char *msg, ...) { static uint32_t logger = 0; if (logger == 0) { @@ -20,36 +39,29 @@ skynet_error(struct skynet_context * context, const char *msg, ...) { return; } - char tmp[LOG_MESSAGE_SIZE]; char *data = NULL; va_list ap; - va_start(ap,msg); - int len = vsnprintf(tmp, LOG_MESSAGE_SIZE, msg, ap); + va_start(ap, msg); + int len = log_try_vasprintf(&data, msg, ap); va_end(ap); - if (len >=0 && len < LOG_MESSAGE_SIZE) { - data = skynet_strdup(tmp); - } else { - int max_size = LOG_MESSAGE_SIZE; - for (;;) { - max_size *= 2; - data = skynet_malloc(max_size); - va_start(ap,msg); - len = vsnprintf(data, max_size, msg, ap); - va_end(ap); - if (len < max_size) { - break; - } - skynet_free(data); - } - } if (len < 0) { - skynet_free(data); - perror("vsnprintf error :"); + perror("vasprintf error :"); return; } + if (data == NULL) { // unlikely + data = skynet_malloc(len + 1); + va_start(ap, msg); + len = vsnprintf(data, len + 1, msg, ap); + va_end(ap); + if (len < 0) { + skynet_free(data); + perror("vsnprintf error :"); + return; + } + } struct skynet_message smsg; if (context == NULL) { @@ -62,4 +74,3 @@ skynet_error(struct skynet_context * context, const char *msg, ...) { smsg.sz = len | ((size_t)PTYPE_TEXT << MESSAGE_TYPE_SHIFT); skynet_context_push(logger, &smsg); } - diff --git a/skynet-src/skynet_handle.c b/skynet-src/skynet_handle.c index 28bd1efe..42a7795d 100644 --- a/skynet-src/skynet_handle.c +++ b/skynet-src/skynet_handle.c @@ -1,6 +1,7 @@ #include "skynet.h" #include "skynet_handle.h" +#include "skynet_imp.h" #include "skynet_server.h" #include "rwlock.h" @@ -23,7 +24,7 @@ struct handle_storage { uint32_t handle_index; int slot_size; struct skynet_context ** slot; - + int name_cap; int name_count; struct handle_name *name; @@ -36,7 +37,7 @@ skynet_handle_register(struct skynet_context *ctx) { struct handle_storage *s = H; rwlock_wlock(&s->lock); - + for (;;) { int i; uint32_t handle = s->handle_index; @@ -111,7 +112,7 @@ skynet_handle_retire(uint32_t handle) { return ret; } -void +void skynet_handle_retireall() { struct handle_storage *s = H; for (;;) { @@ -135,7 +136,7 @@ skynet_handle_retireall() { } } -struct skynet_context * +struct skynet_context * skynet_handle_grab(uint32_t handle) { struct handle_storage *s = H; struct skynet_context * result = NULL; @@ -154,7 +155,7 @@ skynet_handle_grab(uint32_t handle) { return result; } -uint32_t +uint32_t skynet_handle_findname(const char * name) { struct handle_storage *s = H; @@ -234,7 +235,7 @@ _insert_name(struct handle_storage *s, const char * name, uint32_t handle) { return result; } -const char * +const char * skynet_handle_namehandle(uint32_t handle, const char *name) { rwlock_wlock(&H->lock); @@ -245,7 +246,7 @@ skynet_handle_namehandle(uint32_t handle, const char *name) { return ret; } -void +void skynet_handle_init(int harbor) { assert(H==NULL); struct handle_storage * s = skynet_malloc(sizeof(*H)); @@ -265,4 +266,3 @@ skynet_handle_init(int harbor) { // Don't need to free H } - diff --git a/skynet-src/skynet_imp.h b/skynet-src/skynet_imp.h index eef5d509..fc088850 100644 --- a/skynet-src/skynet_imp.h +++ b/skynet-src/skynet_imp.h @@ -1,6 +1,8 @@ #ifndef SKYNET_IMP_H #define SKYNET_IMP_H +#include + struct skynet_config { int thread; int harbor; @@ -20,4 +22,19 @@ struct skynet_config { void skynet_start(struct skynet_config * config); +static inline char * +skynet_strndup(const char *str, size_t size) { + char * ret = skynet_malloc(size+1); + if (ret == NULL) return NULL; + memcpy(ret, str, size); + ret[size] = '\0'; + return ret; +} + +static inline char * +skynet_strdup(const char *str) { + size_t sz = strlen(str); + return skynet_strndup(str, sz); +} + #endif diff --git a/skynet-src/skynet_malloc.h b/skynet-src/skynet_malloc.h index 57f2db13..1a3389b3 100644 --- a/skynet-src/skynet_malloc.h +++ b/skynet-src/skynet_malloc.h @@ -15,7 +15,6 @@ void * skynet_malloc(size_t sz); 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 *ptr, size_t osize, size_t nsize); // use for lua void * skynet_memalign(size_t alignment, size_t size); void * skynet_aligned_alloc(size_t alignment, size_t size); diff --git a/skynet-src/skynet_module.c b/skynet-src/skynet_module.c index b3e43295..9a8d618c 100644 --- a/skynet-src/skynet_module.c +++ b/skynet-src/skynet_module.c @@ -1,5 +1,6 @@ #include "skynet.h" +#include "skynet_imp.h" #include "skynet_module.h" #include "spinlock.h" @@ -62,7 +63,7 @@ _try_open(struct modules *m, const char * name) { return dl; } -static struct skynet_module * +static struct skynet_module * _query(const char * name) { int i; for (i=0;icount;i++) { @@ -99,7 +100,7 @@ open_sym(struct skynet_module *mod) { return mod->init == NULL; } -struct skynet_module * +struct skynet_module * skynet_module_query(const char * name) { struct skynet_module * result = _query(name); if (result) @@ -129,7 +130,7 @@ skynet_module_query(const char * name) { return result; } -void * +void * skynet_module_instance_create(struct skynet_module *m) { if (m->create) { return m->create(); @@ -143,7 +144,7 @@ skynet_module_instance_init(struct skynet_module *m, void * inst, struct skynet_ return m->init(inst, ctx, parm); } -void +void skynet_module_instance_release(struct skynet_module *m, void *inst) { if (m->release) { m->release(inst); @@ -157,7 +158,7 @@ skynet_module_instance_signal(struct skynet_module *m, void *inst, int signal) { } } -void +void skynet_module_init(const char *path) { struct modules *m = skynet_malloc(sizeof(*m)); m->count = 0;