mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +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:
@@ -1,16 +1,35 @@
|
||||
#include "skynet.h"
|
||||
#include "skynet_handle.h"
|
||||
#include "skynet_imp.h"
|
||||
#include "skynet_mq.h"
|
||||
#include "skynet_server.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user