forked from cloudwu/skynet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathskynet_error.c
60 lines (51 loc) · 1.13 KB
/
skynet_error.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "skynet.h"
#include "skynet_handle.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
skynet_error(struct skynet_context * context, const char *msg, ...) {
static uint32_t logger = 0;
if (logger == 0) {
logger = skynet_handle_findname("logger");
}
if (logger == 0) {
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_end(ap);
if (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);
}
}
struct skynet_message smsg;
if (context == NULL) {
smsg.source = 0;
} else {
smsg.source = skynet_context_handle(context);
}
smsg.session = 0;
smsg.data = data;
smsg.sz = len | ((size_t)PTYPE_TEXT << MESSAGE_TYPE_SHIFT);
skynet_context_push(logger, &smsg);
}