Skip to content

Commit 9e692d3

Browse files
committed
Making the server constructors not throw.
1 parent 15484ba commit 9e692d3

File tree

2 files changed

+63
-30
lines changed

2 files changed

+63
-30
lines changed

boost/network/protocol/http/server/async_server.hpp

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,22 @@ namespace boost { namespace network { namespace http {
2525
, Handler & handler
2626
, utils::thread_pool & thread_pool)
2727
: handler(handler)
28+
, address_(address)
29+
, port_(port)
2830
, thread_pool(thread_pool)
31+
, self_service(new asio::io_service())
2932
, io_service()
3033
, acceptor(io_service)
3134
, stopping(false)
32-
{
33-
using boost::asio::ip::tcp;
34-
tcp::resolver resolver(io_service);
35-
tcp::resolver::query query(address, port);
36-
tcp::endpoint endpoint = *resolver.resolve(query);
37-
acceptor.open(endpoint.protocol());
38-
acceptor.bind(endpoint);
39-
acceptor.listen();
40-
new_connection.reset(new connection(io_service, handler, thread_pool));
41-
acceptor.async_accept(new_connection->socket(),
42-
boost::bind(
43-
&async_server_base<Tag,Handler>::handle_accept
44-
, this
45-
, boost::asio::placeholders::error));
46-
}
35+
, new_connection()
36+
, listening_mutex_()
37+
, listening(false)
38+
{}
4739

4840
void run() {
41+
boost::unique_lock<boost::mutex> listening_lock(listening_mutex_);
42+
if (!listening) start_listening();
43+
listening_lock.unlock();
4944
io_service.run();
5045
};
5146

@@ -58,11 +53,15 @@ namespace boost { namespace network { namespace http {
5853

5954
private:
6055
Handler & handler;
56+
string_type address_, port_;
6157
utils::thread_pool & thread_pool;
58+
std::auto_ptr<asio::io_service> self_service;
6259
asio::io_service io_service;
6360
asio::ip::tcp::acceptor acceptor;
6461
bool stopping;
6562
connection_ptr new_connection;
63+
boost::mutex listening_mutex_;
64+
bool listening;
6665

6766
void handle_accept(boost::system::error_code const & ec) {
6867
if (!ec) {
@@ -85,6 +84,23 @@ namespace boost { namespace network { namespace http {
8584
}
8685
}
8786
}
87+
88+
void start_listening() {
89+
using boost::asio::ip::tcp;
90+
tcp::resolver resolver(io_service);
91+
tcp::resolver::query query(address_, port_);
92+
tcp::endpoint endpoint = *resolver.resolve(query);
93+
acceptor.open(endpoint.protocol());
94+
acceptor.bind(endpoint);
95+
acceptor.listen();
96+
listening = true;
97+
new_connection.reset(new connection(io_service, handler, thread_pool));
98+
acceptor.async_accept(new_connection->socket(),
99+
boost::bind(
100+
&async_server_base<Tag,Handler>::handle_accept
101+
, this
102+
, boost::asio::placeholders::error));
103+
}
88104
};
89105

90106
} /* http */

boost/network/protocol/http/server/sync_server.hpp

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <boost/network/protocol/http/request.hpp>
1616
#include <boost/network/protocol/http/server/sync_connection.hpp>
1717
#include <boost/network/traits/string.hpp>
18+
#include <boost/thread/mutex.hpp>
1819

1920
namespace boost { namespace network { namespace http {
2021

@@ -29,23 +30,20 @@ namespace boost { namespace network { namespace http {
2930
string_type const & port,
3031
Handler & handler)
3132
: handler_(handler)
32-
, service_()
33+
, address_(address)
34+
, port_(port)
35+
, self_service_(new boost::asio::io_service())
36+
, service_(*self_service_)
3337
, acceptor_(service_)
34-
, new_connection(new sync_connection<Tag,Handler>(service_, handler))
35-
{
36-
using boost::asio::ip::tcp;
37-
tcp::resolver resolver(service_);
38-
tcp::resolver::query query(address, port);
39-
tcp::endpoint endpoint = *resolver.resolve(query);
40-
acceptor_.open(endpoint.protocol());
41-
acceptor_.bind(endpoint);
42-
acceptor_.listen();
43-
acceptor_.async_accept(new_connection->socket(),
44-
boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
45-
this, boost::asio::placeholders::error));
46-
}
38+
, new_connection()
39+
, listening_mutex_()
40+
, listening_(false)
41+
{}
4742

4843
void run() {
44+
boost::unique_lock<boost::mutex> listening_lock(listening_mutex_);
45+
if (!listening_) start_listening();
46+
listening_lock.unlock();
4947
service_.run();
5048
}
5149

@@ -57,9 +55,13 @@ namespace boost { namespace network { namespace http {
5755
private:
5856

5957
Handler & handler_;
60-
boost::asio::io_service service_;
58+
string_type address_, port_;
59+
std::auto_ptr<boost::asio::io_service> self_service_;
60+
boost::asio::io_service & service_;
6161
boost::asio::ip::tcp::acceptor acceptor_;
6262
boost::shared_ptr<sync_connection<Tag,Handler> > new_connection;
63+
boost::mutex listening_mutex_;
64+
bool listening_;
6365

6466
void handle_accept(boost::system::error_code const & ec) {
6567
if (!ec) {
@@ -70,6 +72,21 @@ namespace boost { namespace network { namespace http {
7072
this, boost::asio::placeholders::error));
7173
}
7274
}
75+
76+
void start_listening() {
77+
using boost::asio::ip::tcp;
78+
tcp::resolver resolver(service_);
79+
tcp::resolver::query query(address_, port_);
80+
tcp::endpoint endpoint = *resolver.resolve(query);
81+
acceptor_.open(endpoint.protocol());
82+
acceptor_.bind(endpoint);
83+
acceptor_.listen();
84+
listening_ = true;
85+
new_connection.reset(new sync_connection<Tag,Handler>(service_, handler_));
86+
acceptor_.async_accept(new_connection->socket(),
87+
boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
88+
this, boost::asio::placeholders::error));
89+
}
7390
};
7491

7592
} /* http */

0 commit comments

Comments
 (0)