-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcontext.cpp
113 lines (102 loc) · 2.17 KB
/
context.cpp
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
#include "common.h"
#include "context.h"
#include "message.h"
#include "singleton.h"
#include "node_lua.h"
context_t::context_t()
: m_parent(0),
m_handle(0),
m_worker(NULL),
m_inited(false),
m_ref(1),
m_processing(true),
m_next_processing(NULL),
m_message_queue_lock(spin_lock_init)
{
}
context_t::~context_t()
{
}
void context_t::on_registered(uint32_t parent, uint32_t handle)
{
if (m_handle == 0) {
m_parent = parent;
m_handle = handle;
grab();
}
}
void context_t::on_retired()
{
if (m_handle != 0) {
m_handle = 0;
release();
}
}
bool context_t::push_message(message_t& message, bool& processing)
{
spin_lock(m_message_queue_lock);
if (m_message_queue.push(message)) {
processing = m_processing;
if (!m_processing) {
m_processing = true;
}
spin_unlock(m_message_queue_lock);
return true;
}
spin_unlock(m_message_queue_lock);
return false;
}
bool context_t::pop_message(message_t& message)
{
spin_lock(m_message_queue_lock);
if (m_message_queue.pop(message)) {
spin_unlock(m_message_queue_lock);
return true;
}
m_processing = false;
#ifndef RELEASE
detach_worker();
#endif
spin_unlock(m_message_queue_lock);
return false;
}
void context_t::on_received(message_t& message)
{
switch (message_raw_type(message)) {
case SYSTEM_CTX_DESTROY:
singleton_ref(node_lua_t).context_destroy(this, message.m_source, message_string(message));
return;
case CONTEXT_QUERY:
if (message.m_source != 0 && message.m_session != LUA_REFNIL) {
singleton_ref(node_lua_t).context_send(message.m_source, m_handle, message.m_session, CONTEXT_REPLY, NL_ENOREPLY);
}
return;
default:
return;
}
}
void context_t::on_dropped(message_t& message)
{
switch (message_raw_type(message)) {
case CONTEXT_QUERY:
if (message.m_source != 0 && message.m_session != LUA_REFNIL) {
singleton_ref(node_lua_t).context_send(message.m_source, m_handle, message.m_session, CONTEXT_REPLY, NL_ENOREPLY);
}
return;
default:
return;
}
}
void context_t::attach_worker(worker_t* worker)
{
#ifndef RELEASE
ASSERT(m_worker == NULL);
#endif
m_worker = worker;
on_worker_attached();
}
void context_t::detach_worker()
{
m_worker = NULL;
on_worker_detached();
}