@@ -45,6 +45,7 @@ static UdpServer::PeerIdType makeSockId(sockaddr *addr, int) {
4545}
4646
4747UdpServer::UdpServer (const EventPoller::Ptr &poller) : Server(poller) {
48+ _multi_poller = !poller;
4849 setOnCreateSocket (nullptr );
4950}
5051
@@ -87,20 +88,22 @@ void UdpServer::start_l(uint16_t port, const std::string &host) {
8788 return false ;
8889 }, _poller);
8990
90- // clone server至不同线程,让udp server支持多线程
91- EventPollerPool::Instance ().for_each ([&](const TaskExecutor::Ptr &executor) {
92- auto poller = std::static_pointer_cast<EventPoller>(executor);
93- if (poller == _poller) {
94- return ;
95- }
96- auto &serverRef = _cloned_server[poller.get ()];
97- if (!serverRef) {
98- serverRef = onCreatServer (poller);
99- }
100- if (serverRef) {
101- serverRef->cloneFrom (*this );
102- }
103- });
91+ if (_multi_poller) {
92+ // clone server至不同线程,让udp server支持多线程
93+ EventPollerPool::Instance ().for_each ([&](const TaskExecutor::Ptr &executor) {
94+ auto poller = std::static_pointer_cast<EventPoller>(executor);
95+ if (poller == _poller) {
96+ return ;
97+ }
98+ auto &serverRef = _cloned_server[poller.get ()];
99+ if (!serverRef) {
100+ serverRef = onCreatServer (poller);
101+ }
102+ if (serverRef) {
103+ serverRef->cloneFrom (*this );
104+ }
105+ });
106+ }
104107
105108 if (!_socket->bindUdpSock (port, host.c_str ())) {
106109 // udp 绑定端口失败, 可能是由于端口占用或权限问题
@@ -193,24 +196,28 @@ void UdpServer::onManagerSession() {
193196 // 拷贝map,防止遍历时移除对象
194197 copy_map = std::make_shared<std::unordered_map<PeerIdType, SessionHelper::Ptr> >(*_session_map);
195198 }
196- EventPollerPool::Instance ().for_each ([copy_map](const TaskExecutor::Ptr &executor) {
197- auto poller = std::static_pointer_cast<EventPoller>(executor);
198- poller->async ([copy_map]() {
199- for (auto &pr : *copy_map) {
200- auto &session = pr.second ->session ();
201- if (!session->getPoller ()->isCurrentThread ()) {
202- // 该session不归属该poller管理
203- continue ;
204- }
205- try {
206- // UDP 会话需要处理超时
207- session->onManager ();
208- } catch (exception &ex) {
209- WarnL << " Exception occurred when emit onManager: " << ex.what ();
210- }
199+ auto lam = [copy_map]() {
200+ for (auto &pr : *copy_map) {
201+ auto &session = pr.second ->session ();
202+ if (!session->getPoller ()->isCurrentThread ()) {
203+ // 该session不归属该poller管理
204+ continue ;
211205 }
206+ try {
207+ // UDP 会话需要处理超时
208+ session->onManager ();
209+ } catch (exception &ex) {
210+ WarnL << " Exception occurred when emit onManager: " << ex.what ();
211+ }
212+ }
213+ };
214+ if (_multi_poller){
215+ EventPollerPool::Instance ().for_each ([lam](const TaskExecutor::Ptr &executor) {
216+ std::static_pointer_cast<EventPoller>(executor)->async (lam);
212217 });
213- });
218+ } else {
219+ lam ();
220+ }
214221}
215222
216223SessionHelper::Ptr UdpServer::getOrCreateSession (const UdpServer::PeerIdType &id, const Buffer::Ptr &buf, sockaddr *addr, int addr_len, bool &is_new) {
@@ -228,7 +235,7 @@ SessionHelper::Ptr UdpServer::getOrCreateSession(const UdpServer::PeerIdType &id
228235
229236SessionHelper::Ptr UdpServer::createSession (const PeerIdType &id, const Buffer::Ptr &buf, struct sockaddr *addr, int addr_len) {
230237 // 此处改成自定义获取poller对象,防止负载不均衡
231- auto socket = createSocket (EventPollerPool::Instance ().getPoller (false ), buf, addr, addr_len);
238+ auto socket = createSocket (_multi_poller ? EventPollerPool::Instance ().getPoller (false ) : _poller , buf, addr, addr_len);
232239 if (!socket) {
233240 // 创建socket失败,本次onRead事件收到的数据直接丢弃
234241 return nullptr ;
0 commit comments