mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
lua-skynet: lerror 格式符使用 "%*s", 节省一次 strlen (#2051)
* lua-skynet: lerror 格式符使用 "%*s", 节省一次 strlen * make skynet_strdup/skynet_strndup static, remove skynet_asprintf/skynet_vasprintf --------- Co-authored-by: efve.zff <efve.zff@alibaba-inc.com>
This commit is contained in:
@@ -207,7 +207,7 @@ lintcommand(lua_State *L) {
|
|||||||
|
|
||||||
result = skynet_command(context, cmd, parm);
|
result = skynet_command(context, cmd, parm);
|
||||||
if (result) {
|
if (result) {
|
||||||
char *endptr = NULL;
|
char *endptr = NULL;
|
||||||
lua_Integer r = strtoll(result, &endptr, 0);
|
lua_Integer r = strtoll(result, &endptr, 0);
|
||||||
if (endptr == NULL || *endptr != '\0') {
|
if (endptr == NULL || *endptr != '\0') {
|
||||||
// may be real number
|
// may be real number
|
||||||
@@ -340,8 +340,9 @@ lerror(lua_State *L) {
|
|||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
if (n <= 1) {
|
if (n <= 1) {
|
||||||
lua_settop(L, 1);
|
lua_settop(L, 1);
|
||||||
const char * s = luaL_tolstring(L, 1, NULL);
|
size_t len;
|
||||||
skynet_error(context, "%s", s);
|
const char *s = luaL_tolstring(L, 1, &len);
|
||||||
|
skynet_error(context, "%*s", (int)len, s);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
luaL_Buffer b;
|
luaL_Buffer b;
|
||||||
@@ -355,7 +356,9 @@ lerror(lua_State *L) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
luaL_pushresult(&b);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,13 +473,13 @@ ltrace(lua_State *L) {
|
|||||||
skynet_error(context, "<TRACE %s> %" PRId64 " %s : %s:%d", tag, get_time(), user, si[0].source, si[0].line);
|
skynet_error(context, "<TRACE %s> %" PRId64 " %s : %s:%d", tag, get_time(), user, si[0].source, si[0].line);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
skynet_error(context, "<TRACE %s> %" PRId64 " %s : %s:%d %s:%d", tag, get_time(), user,
|
skynet_error(context, "<TRACE %s> %" PRId64 " %s : %s:%d %s:%d", tag, get_time(), user,
|
||||||
si[0].source, si[0].line,
|
si[0].source, si[0].line,
|
||||||
si[1].source, si[1].line
|
si[1].source, si[1].line
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
skynet_error(context, "<TRACE %s> %" PRId64 " %s : %s:%d %s:%d %s:%d", tag, get_time(), user,
|
skynet_error(context, "<TRACE %s> %" PRId64 " %s : %s:%d %s:%d %s:%d", tag, get_time(), user,
|
||||||
si[0].source, si[0].line,
|
si[0].source, si[0].line,
|
||||||
si[1].source, si[1].line,
|
si[1].source, si[1].line,
|
||||||
si[2].source, si[2].line
|
si[2].source, si[2].line
|
||||||
|
|||||||
@@ -323,14 +323,6 @@ dump_c_mem() {
|
|||||||
skynet_error(NULL, "+total: %zdkb",total >> 10);
|
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 *
|
void *
|
||||||
skynet_lalloc(void *ptr, size_t osize, size_t nsize) {
|
skynet_lalloc(void *ptr, size_t osize, size_t nsize) {
|
||||||
if (nsize == 0) {
|
if (nsize == 0) {
|
||||||
|
|||||||
@@ -1,16 +1,35 @@
|
|||||||
#include "skynet.h"
|
#include "skynet.h"
|
||||||
#include "skynet_handle.h"
|
#include "skynet_handle.h"
|
||||||
|
#include "skynet_imp.h"
|
||||||
#include "skynet_mq.h"
|
#include "skynet_mq.h"
|
||||||
#include "skynet_server.h"
|
#include "skynet_server.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define LOG_MESSAGE_SIZE 256
|
#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, ...) {
|
skynet_error(struct skynet_context * context, const char *msg, ...) {
|
||||||
static uint32_t logger = 0;
|
static uint32_t logger = 0;
|
||||||
if (logger == 0) {
|
if (logger == 0) {
|
||||||
@@ -20,36 +39,29 @@ skynet_error(struct skynet_context * context, const char *msg, ...) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char tmp[LOG_MESSAGE_SIZE];
|
|
||||||
char *data = NULL;
|
char *data = NULL;
|
||||||
|
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap,msg);
|
va_start(ap, msg);
|
||||||
int len = vsnprintf(tmp, LOG_MESSAGE_SIZE, msg, ap);
|
int len = log_try_vasprintf(&data, msg, ap);
|
||||||
va_end(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) {
|
if (len < 0) {
|
||||||
skynet_free(data);
|
perror("vasprintf error :");
|
||||||
perror("vsnprintf error :");
|
|
||||||
return;
|
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;
|
struct skynet_message smsg;
|
||||||
if (context == NULL) {
|
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);
|
smsg.sz = len | ((size_t)PTYPE_TEXT << MESSAGE_TYPE_SHIFT);
|
||||||
skynet_context_push(logger, &smsg);
|
skynet_context_push(logger, &smsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "skynet.h"
|
#include "skynet.h"
|
||||||
|
|
||||||
#include "skynet_handle.h"
|
#include "skynet_handle.h"
|
||||||
|
#include "skynet_imp.h"
|
||||||
#include "skynet_server.h"
|
#include "skynet_server.h"
|
||||||
#include "rwlock.h"
|
#include "rwlock.h"
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ struct handle_storage {
|
|||||||
uint32_t handle_index;
|
uint32_t handle_index;
|
||||||
int slot_size;
|
int slot_size;
|
||||||
struct skynet_context ** slot;
|
struct skynet_context ** slot;
|
||||||
|
|
||||||
int name_cap;
|
int name_cap;
|
||||||
int name_count;
|
int name_count;
|
||||||
struct handle_name *name;
|
struct handle_name *name;
|
||||||
@@ -36,7 +37,7 @@ skynet_handle_register(struct skynet_context *ctx) {
|
|||||||
struct handle_storage *s = H;
|
struct handle_storage *s = H;
|
||||||
|
|
||||||
rwlock_wlock(&s->lock);
|
rwlock_wlock(&s->lock);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int i;
|
int i;
|
||||||
uint32_t handle = s->handle_index;
|
uint32_t handle = s->handle_index;
|
||||||
@@ -111,7 +112,7 @@ skynet_handle_retire(uint32_t handle) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
skynet_handle_retireall() {
|
skynet_handle_retireall() {
|
||||||
struct handle_storage *s = H;
|
struct handle_storage *s = H;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -135,7 +136,7 @@ skynet_handle_retireall() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct skynet_context *
|
struct skynet_context *
|
||||||
skynet_handle_grab(uint32_t handle) {
|
skynet_handle_grab(uint32_t handle) {
|
||||||
struct handle_storage *s = H;
|
struct handle_storage *s = H;
|
||||||
struct skynet_context * result = NULL;
|
struct skynet_context * result = NULL;
|
||||||
@@ -154,7 +155,7 @@ skynet_handle_grab(uint32_t handle) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
skynet_handle_findname(const char * name) {
|
skynet_handle_findname(const char * name) {
|
||||||
struct handle_storage *s = H;
|
struct handle_storage *s = H;
|
||||||
|
|
||||||
@@ -234,7 +235,7 @@ _insert_name(struct handle_storage *s, const char * name, uint32_t handle) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
skynet_handle_namehandle(uint32_t handle, const char *name) {
|
skynet_handle_namehandle(uint32_t handle, const char *name) {
|
||||||
rwlock_wlock(&H->lock);
|
rwlock_wlock(&H->lock);
|
||||||
|
|
||||||
@@ -245,7 +246,7 @@ skynet_handle_namehandle(uint32_t handle, const char *name) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
skynet_handle_init(int harbor) {
|
skynet_handle_init(int harbor) {
|
||||||
assert(H==NULL);
|
assert(H==NULL);
|
||||||
struct handle_storage * s = skynet_malloc(sizeof(*H));
|
struct handle_storage * s = skynet_malloc(sizeof(*H));
|
||||||
@@ -265,4 +266,3 @@ skynet_handle_init(int harbor) {
|
|||||||
|
|
||||||
// Don't need to free H
|
// Don't need to free H
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#ifndef SKYNET_IMP_H
|
#ifndef SKYNET_IMP_H
|
||||||
#define SKYNET_IMP_H
|
#define SKYNET_IMP_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
struct skynet_config {
|
struct skynet_config {
|
||||||
int thread;
|
int thread;
|
||||||
int harbor;
|
int harbor;
|
||||||
@@ -20,4 +22,19 @@ struct skynet_config {
|
|||||||
|
|
||||||
void skynet_start(struct skynet_config * 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
|
#endif
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ void * skynet_malloc(size_t sz);
|
|||||||
void * skynet_calloc(size_t nmemb,size_t size);
|
void * skynet_calloc(size_t nmemb,size_t size);
|
||||||
void * skynet_realloc(void *ptr, size_t size);
|
void * skynet_realloc(void *ptr, size_t size);
|
||||||
void skynet_free(void *ptr);
|
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_lalloc(void *ptr, size_t osize, size_t nsize); // use for lua
|
||||||
void * skynet_memalign(size_t alignment, size_t size);
|
void * skynet_memalign(size_t alignment, size_t size);
|
||||||
void * skynet_aligned_alloc(size_t alignment, size_t size);
|
void * skynet_aligned_alloc(size_t alignment, size_t size);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "skynet.h"
|
#include "skynet.h"
|
||||||
|
|
||||||
|
#include "skynet_imp.h"
|
||||||
#include "skynet_module.h"
|
#include "skynet_module.h"
|
||||||
#include "spinlock.h"
|
#include "spinlock.h"
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ _try_open(struct modules *m, const char * name) {
|
|||||||
return dl;
|
return dl;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct skynet_module *
|
static struct skynet_module *
|
||||||
_query(const char * name) {
|
_query(const char * name) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<M->count;i++) {
|
for (i=0;i<M->count;i++) {
|
||||||
@@ -99,7 +100,7 @@ open_sym(struct skynet_module *mod) {
|
|||||||
return mod->init == NULL;
|
return mod->init == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct skynet_module *
|
struct skynet_module *
|
||||||
skynet_module_query(const char * name) {
|
skynet_module_query(const char * name) {
|
||||||
struct skynet_module * result = _query(name);
|
struct skynet_module * result = _query(name);
|
||||||
if (result)
|
if (result)
|
||||||
@@ -129,7 +130,7 @@ skynet_module_query(const char * name) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
skynet_module_instance_create(struct skynet_module *m) {
|
skynet_module_instance_create(struct skynet_module *m) {
|
||||||
if (m->create) {
|
if (m->create) {
|
||||||
return 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);
|
return m->init(inst, ctx, parm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
skynet_module_instance_release(struct skynet_module *m, void *inst) {
|
skynet_module_instance_release(struct skynet_module *m, void *inst) {
|
||||||
if (m->release) {
|
if (m->release) {
|
||||||
m->release(inst);
|
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) {
|
skynet_module_init(const char *path) {
|
||||||
struct modules *m = skynet_malloc(sizeof(*m));
|
struct modules *m = skynet_malloc(sizeof(*m));
|
||||||
m->count = 0;
|
m->count = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user