-
Notifications
You must be signed in to change notification settings - Fork 1
/
MsgCenter.cpp
145 lines (110 loc) · 3.4 KB
/
MsgCenter.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/******************************************************************************
作者: 何登锋
功能说明:
******************************************************************************/
#include "MsgCenter.h"
#include "MsgDefine.h"
#include "MsgClient.h"
const char* MsgCenter::MESSAGE_CENTER_ENDPOINT = "inproc://message_center";
/**************************************************************************
作者: 何登锋
功能描述:
注册消息客户系统。
参数说明:
返回值:
**************************************************************************/
bool MsgCenter::register_client(thread::id id, MsgClient &client)
{
pair<MsgCenterMap::iterator, bool> ret;
lock_guard<std::recursive_mutex> lock(_mutex);
ret = _client_pool.insert(MsgCenterPair(id, &client));
return ret.second;
}
/**************************************************************************
作者: 何登锋
功能描述:
返回消息客户系统。
参数说明:
返回值:
**************************************************************************/
MsgClient *MsgCenter::find_client(thread::id id)
{
MsgCenterMap::iterator it;
lock_guard<std::recursive_mutex> lock(_mutex);
it = _client_pool.find(id);
if(it == _client_pool.end())
{
return NULL;
}
return (*it).second;
}
/**************************************************************************
作者: 何登锋
功能描述:
清除所有消息客户系统的消息队列。
参数说明:
返回值:
**************************************************************************/
void MsgCenter::clear_all_message_queue(void)
{
//todo:此处需要注意死锁
lock_guard<std::recursive_mutex> lock(_mutex);
if(_client_pool.empty() == true)
{
return;
}
MsgCenterMap::iterator it = _client_pool.begin();
for(; it!=_client_pool.end(); ++it)
{
((*it).second)->clear_message_queue();
}
}
/**************************************************************************
作者: 何登锋
功能描述:
该方法将把消息派发给其他消息客户系统。
参数说明:
返回值:
**************************************************************************/
bool MsgCenter::dispatch_message(const MsgClient &client, const MsgEntity &msg)
{
//todo:此处需要注意死锁
lock_guard<std::recursive_mutex> lock(_mutex);
MsgCenterMap::iterator it = _client_pool.begin();
for(; it!=_client_pool.end(); ++it)
{
if(*((*it).second) == client)
{
continue;
}
// 这里直接将消息添加到客户端的接受队列当中,并不管该消息客户端是否订阅了该
// 消息。如果需要扩展的话也不是太难,但是也有一个比较的过程,该过程并不能提
// 高很多效率,因此暂时没有实现。
((*it).second)->add_message_to_receive_queue(msg);
}
return true;
}
/******************************************************************************
作者:何登锋
功能描述:
参数说明:
返回值:
******************************************************************************/
MsgCenter::MsgCenter()
{
}
/******************************************************************************
作者:何登锋
功能描述:
参数说明:
返回值:
******************************************************************************/
MsgCenter::~MsgCenter()
{
// 析够所有的消息客户系统。
MsgCenterMap::iterator it = _client_pool.begin();
for(; it != _client_pool.end(); ++it)
{
delete (*it).second;
}
}