-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathmessage.h
More file actions
127 lines (107 loc) · 4.44 KB
/
Copy pathmessage.h
File metadata and controls
127 lines (107 loc) · 4.44 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#ifndef MESSAGE_H_
#define MESSAGE_H_
#include "buffer.h"
#define MESSAGE_TYPE_BIT 24
#define MAKE_MESSAGE_TYPE(mtype, dtype) (((uint32_t)(dtype) << MESSAGE_TYPE_BIT) | ((mtype) & (((uint32_t)1 << MESSAGE_TYPE_BIT) - 1)))
#define DATA_TYPE(type) (type >> (MESSAGE_TYPE_BIT))
#define MESSAGE_TYPE(type) (type & ((((uint32_t)1 << MESSAGE_TYPE_BIT) - 1)))
typedef struct { uint8_t m_nil; } nil_t;
enum data_type {
NIL = 0,
TBOOLEAN = 1,
USERDATA = 2, //light userdata
NUMBER = 3,
BUFFER = 4, //need to be freed
STRING = 5, //need to be freed
TERROR = 6 //
};
typedef union data_t {
bool m_bool;
void *m_userdata;
double m_number;
buffer_t m_buffer;
char *m_string;
int32_t m_error;
} data_t;
enum message_type {
INVALID_MESSAGE = 0,
////////////////////////////////////////
SYSTEM_CTX_DESTROY,
CONTEXT_QUERY,
CONTEXT_REPLY,
SYSTEM_MESSAGE_END,
////////////////////////////////////////
LUA_CTX_INIT,
LUA_CTX_WAIT,
LUA_CTX_WAKEUP,
RESPONSE_TCP_LISTEN,
RESPONSE_TCP_ACCEPT,
RESPONSE_TCP_CONNECT,
RESPONSE_TCP_READ,
RESPONSE_TCP_WRITE,
RESPONSE_TCP_CLOSING,
RESPONSE_HANDLE_CLOSE,
RESPONSE_TIMEOUT
};
#define message_raw_type(msg) (MESSAGE_TYPE((msg).m_type))
#define message_bool(msg) ((msg).m_data.m_bool)
#define message_userdata(msg) ((msg).m_data.m_userdata)
#define message_number(msg) ((msg).m_data.m_number)
#define message_buffer(msg) ((msg).m_data.m_buffer)
#define message_string(msg) ((msg).m_data.m_string)
#define message_error(msg) ((msg).m_data.m_error)
#define message_data_type(msg) (DATA_TYPE((msg).m_type))
#define message_is_nil(msg) (NIL == message_data_type(msg))
#define message_is_bool(msg) (TBOOLEAN == message_data_type(msg))
#define message_is_userdata(msg) (USERDATA == message_data_type(msg))
#define message_is_number(msg) (NUMBER == message_data_type(msg))
#define message_is_buffer(msg) (BUFFER == message_data_type(msg))
#define message_is_string(msg) (STRING == message_data_type(msg))
#define message_is_error(msg) (TERROR == message_data_type(msg))
#define message_is_pure_error(msg) (TERROR == message_data_type(msg) && message_error(msg) != 0)
#define message_buffer_grab(msg) if (message_is_buffer(msg)) { buffer_grab(msg.m_data.m_buffer); }
#define message_buffer_release(msg) if (message_is_buffer(msg)) { buffer_release(msg.m_data.m_buffer); }
#define message_clean(msg) do { \
if (message_is_buffer(msg)) { \
buffer_release(msg.m_data.m_buffer); \
} else if (message_is_string(msg)&&(msg).m_data.m_string) { \
nl_free((msg).m_data.m_string); \
msg.m_data.m_string = NULL; \
} \
} while (0)
class message_t {
public:
message_t()
: m_source(0), m_session(0),
m_type(MAKE_MESSAGE_TYPE(INVALID_MESSAGE, NIL)) {}
message_t(uint32_t source, int32_t session, uint32_t msg_type, nil_t nil)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, NIL)) {}
message_t(uint32_t source, int32_t session, uint32_t msg_type, bool bval)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, TBOOLEAN)) { m_data.m_bool = bval; }
message_t(uint32_t source, int32_t session, uint32_t msg_type, void *userdata)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, USERDATA)) { m_data.m_userdata = userdata; }
message_t(uint32_t source, int32_t session, uint32_t msg_type, const buffer_t& buffer)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, BUFFER)) { m_data.m_buffer = buffer; }
message_t(uint32_t source, int32_t session, uint32_t msg_type, double number)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, NUMBER)) { m_data.m_number = number; }
message_t(uint32_t source, int32_t session, uint32_t msg_type, char *string)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, STRING)) { m_data.m_string = string; }
message_t(uint32_t source, int32_t session, uint32_t msg_type, uv_err_code err)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, TERROR)) { m_data.m_error = err; }
message_t(uint32_t source, int32_t session, uint32_t msg_type, nl_err_code err)
: m_source(source), m_session(session),
m_type(MAKE_MESSAGE_TYPE(msg_type, TERROR)) { m_data.m_error = err; }
public:
uint32_t m_source;
int32_t m_session;
uint32_t m_type;
data_t m_data;
};
#endif