@@ -18,6 +18,7 @@ RawTransport<prot>::RawTransport(RawTransportListener* listener, size_t initialB
18
18
: m_isClosing(false )
19
19
, m_tag(tag)
20
20
, m_bufferSize(initialBufferSize)
21
+ , m_service(getIOService())
21
22
, m_listener(listener)
22
23
, m_receivedBytes(0 )
23
24
{
@@ -36,11 +37,9 @@ void RawTransport<prot>::close()
36
37
if (m_isClosing)
37
38
return ;
38
39
39
- // We need to wait for the work thread to finish its job.
40
40
m_isClosing = true ;
41
- m_ioService.stop ();
42
- m_workThread.join ();
43
-
41
+ // Release the service
42
+ m_service.reset ();
44
43
boost::system::error_code ec;
45
44
switch (prot) {
46
45
case TCP:
@@ -71,8 +70,8 @@ void RawTransport<prot>::createConnection(const std::string& ip, uint32_t port)
71
70
if (m_socket.tcp .socket ) {
72
71
ELOG_WARN (" TCP transport existed, ignoring the connection request for ip %s port %d\n " , ip.c_str (), port);
73
72
} else {
74
- m_socket.tcp .socket .reset (new tcp::socket (m_ioService ));
75
- tcp::resolver resolver (m_ioService );
73
+ m_socket.tcp .socket .reset (new tcp::socket (m_service-> service () ));
74
+ tcp::resolver resolver (m_service-> service () );
76
75
tcp::resolver::query query (ip.c_str (), boost::to_string (port).c_str ());
77
76
tcp::resolver::iterator iterator = resolver.resolve (query);
78
77
// TODO: Accept IPv6.
@@ -87,8 +86,8 @@ void RawTransport<prot>::createConnection(const std::string& ip, uint32_t port)
87
86
if (m_socket.udp .socket ) {
88
87
ELOG_WARN (" UDP transport existed, ignoring the connection request for ip %s port %d\n " , ip.c_str (), port);
89
88
} else {
90
- m_socket.udp .socket .reset (new udp::socket (m_ioService ));
91
- udp::resolver resolver (m_ioService );
89
+ m_socket.udp .socket .reset (new udp::socket (m_service-> service () ));
90
+ udp::resolver resolver (m_service-> service () );
92
91
udp::resolver::query query (udp::v4 (), ip.c_str (), boost::to_string (port).c_str ());
93
92
udp::resolver::iterator iterator = resolver.resolve (query);
94
93
@@ -103,9 +102,6 @@ void RawTransport<prot>::createConnection(const std::string& ip, uint32_t port)
103
102
default :
104
103
break ;
105
104
}
106
-
107
- if (m_workThread.get_id () == boost::thread::id ()) // Not-A-Thread
108
- m_workThread = boost::thread (boost::bind (&boost::asio::io_service::run, &m_ioService));
109
105
}
110
106
111
107
template <Protocol prot>
@@ -179,8 +175,8 @@ void RawTransport<prot>::listenTo(uint32_t port)
179
175
if (m_socket.tcp .socket ) {
180
176
ELOG_WARN (" TCP transport existed, ignoring the listening request for port %d\n " , port);
181
177
} else {
182
- m_socket.tcp .socket .reset (new tcp::socket (m_ioService ));
183
- m_socket.tcp .acceptor .reset (new tcp::acceptor (m_ioService , tcp::endpoint (tcp::v4 (), port)));
178
+ m_socket.tcp .socket .reset (new tcp::socket (m_service-> service () ));
179
+ m_socket.tcp .acceptor .reset (new tcp::acceptor (m_service-> service () , tcp::endpoint (tcp::v4 (), port)));
184
180
m_socket.tcp .acceptor ->async_accept (*(m_socket.tcp .socket .get ()),
185
181
boost::bind (&RawTransport::acceptHandler, this ,
186
182
boost::asio::placeholders::error));
@@ -192,17 +188,14 @@ void RawTransport<prot>::listenTo(uint32_t port)
192
188
if (m_socket.udp .socket ) {
193
189
ELOG_WARN (" UDP transport existed, ignoring the listening request for port %d\n " , port);
194
190
} else {
195
- m_socket.udp .socket .reset (new udp::socket (m_ioService , udp::endpoint (udp::v4 (), port)));
191
+ m_socket.udp .socket .reset (new udp::socket (m_service-> service () , udp::endpoint (udp::v4 (), port)));
196
192
receiveData ();
197
193
}
198
194
break ;
199
195
}
200
196
default :
201
197
break ;
202
198
}
203
-
204
- if (m_workThread.get_id () == boost::thread::id ()) // Not-A-Thread
205
- m_workThread = boost::thread (boost::bind (&boost::asio::io_service::run, &m_ioService));
206
199
}
207
200
208
201
template <Protocol prot>
@@ -213,15 +206,15 @@ void RawTransport<prot>::listenTo(uint32_t minPort, uint32_t maxPort)
213
206
if (m_socket.tcp .socket ) {
214
207
ELOG_WARN (" TCP transport existed, ignoring the listening request for minPort %d, maxPort %d\n " , minPort, maxPort);
215
208
} else {
216
- m_socket.tcp .socket .reset (new tcp::socket (m_ioService ));
209
+ m_socket.tcp .socket .reset (new tcp::socket (m_service-> service () ));
217
210
218
211
// find port in range
219
212
uint32_t portRange = maxPort - minPort + 1 ;
220
213
uint32_t port = rand () % portRange + minPort;
221
214
boost::system::error_code ec;
222
215
223
216
for (uint32_t i = 0 ; i < portRange; i++) {
224
- m_socket.tcp .acceptor .reset (new tcp::acceptor (m_ioService ));
217
+ m_socket.tcp .acceptor .reset (new tcp::acceptor (m_service-> service () ));
225
218
m_socket.tcp .acceptor ->open (tcp::v4 ());
226
219
m_socket.tcp .acceptor ->bind (tcp::endpoint (tcp::v4 (), port), ec);
227
220
@@ -260,17 +253,14 @@ void RawTransport<prot>::listenTo(uint32_t minPort, uint32_t maxPort)
260
253
ELOG_WARN (" UDP transport existed, ignoring the listening request for minPort %d, maxPort %d\n " , minPort, maxPort);
261
254
} else {
262
255
ELOG_WARN (" UDP transport does not support listening in specific range." );
263
- m_socket.udp .socket .reset (new udp::socket (m_ioService , udp::endpoint (udp::v4 (), 0 )));
256
+ m_socket.udp .socket .reset (new udp::socket (m_service-> service () , udp::endpoint (udp::v4 (), 0 )));
264
257
receiveData ();
265
258
}
266
259
break ;
267
260
}
268
261
default :
269
262
break ;
270
263
}
271
-
272
- if (m_workThread.get_id () == boost::thread::id ()) // Not-A-Thread
273
- m_workThread = boost::thread (boost::bind (&boost::asio::io_service::run, &m_ioService));
274
264
}
275
265
276
266
template <Protocol prot>
0 commit comments