15
15
#include < boost/network/protocol/http/request.hpp>
16
16
#include < boost/network/protocol/http/server/sync_connection.hpp>
17
17
#include < boost/network/traits/string.hpp>
18
+ #include < boost/thread/mutex.hpp>
18
19
19
20
namespace boost { namespace network { namespace http {
20
21
@@ -29,23 +30,20 @@ namespace boost { namespace network { namespace http {
29
30
string_type const & port,
30
31
Handler & handler)
31
32
: handler_(handler)
32
- , service_()
33
+ , address_(address)
34
+ , port_(port)
35
+ , self_service_(new boost::asio::io_service())
36
+ , service_(*self_service_)
33
37
, 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
+ {}
47
42
48
43
void run () {
44
+ boost::unique_lock<boost::mutex> listening_lock (listening_mutex_);
45
+ if (!listening_) start_listening ();
46
+ listening_lock.unlock ();
49
47
service_.run ();
50
48
}
51
49
@@ -57,9 +55,13 @@ namespace boost { namespace network { namespace http {
57
55
private:
58
56
59
57
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_;
61
61
boost::asio::ip::tcp::acceptor acceptor_;
62
62
boost::shared_ptr<sync_connection<Tag,Handler> > new_connection;
63
+ boost::mutex listening_mutex_;
64
+ bool listening_;
63
65
64
66
void handle_accept (boost::system::error_code const & ec) {
65
67
if (!ec) {
@@ -70,6 +72,21 @@ namespace boost { namespace network { namespace http {
70
72
this , boost::asio::placeholders::error));
71
73
}
72
74
}
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
+ }
73
90
};
74
91
75
92
} /* http */
0 commit comments