diff options
author | Razvan Becheriu <razvan@isc.org> | 2023-12-14 19:16:52 +0100 |
---|---|---|
committer | Razvan Becheriu <razvan@isc.org> | 2024-03-05 08:50:05 +0100 |
commit | 1b070fe4b53be34d34bdbfe59ec22d65b27fa982 (patch) | |
tree | ff4fa433d4739afe2e9944b46cbab587afd302c5 /src/lib | |
parent | [#3271] bump version in configure.ac to 2.5.7 (diff) | |
download | kea-1b070fe4b53be34d34bdbfe59ec22d65b27fa982.tar.xz kea-1b070fe4b53be34d34bdbfe59ec22d65b27fa982.zip |
[#3190] use smart pointer to capture IOService instance
Diffstat (limited to 'src/lib')
86 files changed, 700 insertions, 674 deletions
diff --git a/src/lib/asiodns/io_fetch.cc b/src/lib/asiodns/io_fetch.cc index dd6632ffdd..df8cf18565 100644 --- a/src/lib/asiodns/io_fetch.cc +++ b/src/lib/asiodns/io_fetch.cc @@ -55,17 +55,17 @@ const int DBG_ALL = DBGLVL_TRACE_DETAIL + 20; /// want keep the same data). Organising the data in this way keeps copying to /// a minimum. struct IOFetchData { - + IOServicePtr io_service_; ///< The IO service // The first two members are shared pointers to a base class because what is // actually instantiated depends on whether the fetch is over UDP or TCP, // which is not known until construction of the IOFetch. Use of a shared // pointer here is merely to ensure deletion when the data object is deleted. - boost::scoped_ptr<IOAsioSocket<IOFetch> > socket; + boost::scoped_ptr<IOAsioSocket<IOFetch>> socket; ///< Socket to use for I/O boost::scoped_ptr<IOEndpoint> remote_snd;///< Where the fetch is sent boost::scoped_ptr<IOEndpoint> remote_rcv;///< Where the response came from - OutputBufferPtr msgbuf; ///< Wire buffer for question - OutputBufferPtr received; ///< Received data put here + OutputBufferPtr msgbuf; ///< Wire buffer for question + OutputBufferPtr received; ///< Received data put here IOFetch::Callback* callback; ///< Called on I/O Completion boost::asio::deadline_timer timer; ///< Timer to measure timeouts IOFetch::Protocol protocol; ///< Protocol being used @@ -103,14 +103,14 @@ struct IOFetchData { /// \param wait Timeout for the fetch (in ms). /// /// TODO: May need to alter constructor (see comment 4 in Trac ticket #554) - IOFetchData(IOFetch::Protocol proto, IOService& service, + IOFetchData(IOFetch::Protocol proto, const IOServicePtr& service, const IOAddress& address, uint16_t port, OutputBufferPtr& buff, - IOFetch::Callback* cb, int wait) : + IOFetch::Callback* cb, int wait) : io_service_(service), socket((proto == IOFetch::UDP) ? static_cast<IOAsioSocket<IOFetch>*>( - new UDPSocket<IOFetch>(service)) : + new UDPSocket<IOFetch>(io_service_)) : static_cast<IOAsioSocket<IOFetch>*>( - new TCPSocket<IOFetch>(service)) + new TCPSocket<IOFetch>(io_service_)) ), remote_snd((proto == IOFetch::UDP) ? static_cast<IOEndpoint*>(new UDPEndpoint(address, port)) : @@ -123,7 +123,7 @@ struct IOFetchData { msgbuf(new OutputBuffer(512)), received(buff), callback(cb), - timer(service.getInternalIOService()), + timer(io_service_->getInternalIOService()), protocol(proto), cumulative(0), expected(0), @@ -151,7 +151,7 @@ struct IOFetchData { /// IOFetch Constructor - just initialize the private data -IOFetch::IOFetch(Protocol protocol, IOService& service, +IOFetch::IOFetch(Protocol protocol, const IOServicePtr& service, const isc::dns::Question& question, const IOAddress& address, uint16_t port, OutputBufferPtr& buff, Callback* cb, int wait, bool edns) { MessagePtr query_msg(new Message(Message::RENDER)); @@ -159,7 +159,7 @@ IOFetch::IOFetch(Protocol protocol, IOService& service, cb, wait, edns); } -IOFetch::IOFetch(Protocol protocol, IOService& service, +IOFetch::IOFetch(Protocol protocol, const IOServicePtr& service, OutputBufferPtr& outpkt, const IOAddress& address, uint16_t port, OutputBufferPtr& buff, Callback* cb, int wait) : data_(new IOFetchData(protocol, service, @@ -168,7 +168,7 @@ IOFetch::IOFetch(Protocol protocol, IOService& service, data_->packet = true; } -IOFetch::IOFetch(Protocol protocol, IOService& service, +IOFetch::IOFetch(Protocol protocol, const IOServicePtr& service, ConstMessagePtr query_message, const IOAddress& address, uint16_t port, OutputBufferPtr& buff, Callback* cb, int wait) { MessagePtr msg(new Message(Message::RENDER)); @@ -185,7 +185,7 @@ IOFetch::IOFetch(Protocol protocol, IOService& service, void IOFetch::initIOFetch(MessagePtr& query_msg, Protocol protocol, - IOService& service, + const IOServicePtr& service, const isc::dns::Question& question, const IOAddress& address, uint16_t port, OutputBufferPtr& buff, Callback* cb, int wait, bool edns) { diff --git a/src/lib/asiodns/io_fetch.h b/src/lib/asiodns/io_fetch.h index 4b247abfa4..fea13e0455 100644 --- a/src/lib/asiodns/io_fetch.h +++ b/src/lib/asiodns/io_fetch.h @@ -132,7 +132,7 @@ public: /// -1 indicates no timeout. /// \param edns true if the request should be EDNS. The default value is /// true. - IOFetch(Protocol protocol, isc::asiolink::IOService& service, + IOFetch(Protocol protocol, const isc::asiolink::IOServicePtr& service, const isc::dns::Question& question, const isc::asiolink::IOAddress& address, uint16_t port, isc::util::OutputBufferPtr& buff, Callback* cb, @@ -159,7 +159,7 @@ public: /// and deleting it if necessary. /// \param wait Timeout for the fetch (in ms). The default value of /// -1 indicates no timeout. - IOFetch(Protocol protocol, isc::asiolink::IOService& service, + IOFetch(Protocol protocol, const isc::asiolink::IOServicePtr& service, isc::dns::ConstMessagePtr query_message, const isc::asiolink::IOAddress& address, uint16_t port, isc::util::OutputBufferPtr& buff, Callback* cb, @@ -184,7 +184,7 @@ public: /// (default = 53) /// \param wait Timeout for the fetch (in ms). The default value of /// -1 indicates no timeout. - IOFetch(Protocol protocol, isc::asiolink::IOService& service, + IOFetch(Protocol protocol, const isc::asiolink::IOServicePtr& service, isc::util::OutputBufferPtr& outpkt, const isc::asiolink::IOAddress& address, uint16_t port, isc::util::OutputBufferPtr& buff, Callback* cb, @@ -218,7 +218,7 @@ private: /// parameter "query_message" /// \param query_message the message to be sent out. void initIOFetch(isc::dns::MessagePtr& query_message, Protocol protocol, - isc::asiolink::IOService& service, + const isc::asiolink::IOServicePtr& service, const isc::dns::Question& question, const isc::asiolink::IOAddress& address, uint16_t port, isc::util::OutputBufferPtr& buff, Callback* cb, int wait, diff --git a/src/lib/asiodns/tests/io_fetch_unittest.cc b/src/lib/asiodns/tests/io_fetch_unittest.cc index 6529c356ba..5bab99f6a3 100644 --- a/src/lib/asiodns/tests/io_fetch_unittest.cc +++ b/src/lib/asiodns/tests/io_fetch_unittest.cc @@ -55,7 +55,7 @@ const bool DEBUG = false; class IOFetchTest : public virtual ::testing::Test, public virtual IOFetch::Callback { public: - IOService service_; ///< Service to run the query + IOServicePtr service_; ///< Service to run the query IOFetch::Result expected_; ///< Expected result of the callback bool run_; ///< Did the callback run already? Question question_; ///< What to ask @@ -88,7 +88,7 @@ public: /// \brief Constructor IOFetchTest() : - service_(), + service_(new IOService()), expected_(IOFetch::NOTSET), run_(false), question_(Name("example.net"), RRClass::IN(), RRType::A()), @@ -101,7 +101,7 @@ public: // Timeout interval chosen to ensure no timeout protocol_(IOFetch::TCP), // for initialization - will be changed cumulative_(0), - timer_(service_.getInternalIOService()), + timer_(service_->getInternalIOService()), receive_buffer_(), expected_buffer_(new OutputBuffer(512)), send_buffer_(), @@ -455,7 +455,7 @@ public: } // ... and cause the run loop to exit. - service_.stop(); + service_->stop(); } // The next set of methods are the tests themselves. A number of the TCP @@ -474,15 +474,15 @@ public: expected_ = IOFetch::STOPPED; // Post the query - service_.post(fetch); + service_->post(fetch); // Post query_.stop() (yes, the std::bind thing is just // query_.stop()). - service_.post(std::bind(&IOFetch::stop, fetch, IOFetch::STOPPED)); + service_->post(std::bind(&IOFetch::stop, fetch, IOFetch::STOPPED)); // Run both of them. run() returns when everything in the I/O service // queue has completed. - service_.run(); + service_->run(); EXPECT_TRUE(run_); } @@ -500,9 +500,9 @@ public: // Stop before it is started fetch.stop(); - service_.post(fetch); + service_->post(fetch); - service_.run(); + service_->run(); EXPECT_TRUE(run_); } @@ -516,8 +516,8 @@ public: protocol_ = protocol; expected_ = IOFetch::TIME_OUT; - service_.post(fetch); - service_.run(); + service_->post(fetch); + service_->run(); EXPECT_TRUE(run_); } @@ -542,21 +542,21 @@ public: } // Socket into which the connection will be accepted. - tcp::socket socket(service_.getInternalIOService()); + tcp::socket socket(service_->getInternalIOService()); // Acceptor object - called when the connection is made, the handler // will initiate a read on the socket. - tcp::acceptor acceptor(service_.getInternalIOService(), + tcp::acceptor acceptor(service_->getInternalIOService(), tcp::endpoint(tcp::v4(), TEST_PORT)); acceptor.async_accept(socket, std::bind(&IOFetchTest::tcpAcceptHandler, this, &socket, ph::_1)); // Post the TCP fetch object to send the query and receive the response. - service_.post(tcp_fetch_); + service_->post(tcp_fetch_); // ... and execute all the callbacks. This exits when the fetch // completes. - service_.run(); + service_->run(); EXPECT_TRUE(run_); // Make sure the callback did execute // Tidy up @@ -574,7 +574,7 @@ public: protocol_ = IOFetch::UDP; // Set up the server. - udp::socket socket(service_.getInternalIOService(), udp::v4()); + udp::socket socket(service_->getInternalIOService(), udp::v4()); socket.set_option(socket_base::reuse_address(true)); socket.bind(udp::endpoint(TEST_HOST, TEST_PORT)); return_data_ = "Message returned to the client"; @@ -586,12 +586,12 @@ public: std::bind(&IOFetchTest::udpReceiveHandler, this, &remote, &socket, ph::_1, ph::_2, bad_qid, second_send)); - service_.post(udp_fetch_); + service_->post(udp_fetch_); if (debug_) { cout << "udpSendReceive: async_receive_from posted," "waiting for callback" << endl; } - service_.run(); + service_->run(); socket.close(); diff --git a/src/lib/asiolink/botan_boost_tls.h b/src/lib/asiolink/botan_boost_tls.h index 45dcfa8630..5c74d2702a 100644 --- a/src/lib/asiolink/botan_boost_tls.h +++ b/src/lib/asiolink/botan_boost_tls.h @@ -107,9 +107,9 @@ typedef Botan::TLS::Stream<boost::asio::ip::tcp::socket> TlsStreamImpl; /// @note The caller must not provide a null pointer to the TLS context. template <typename Callback, typename TlsStreamImpl> TlsStreamBase<Callback, TlsStreamImpl>:: -TlsStreamBase(IOService& service, TlsContextPtr context) - : TlsStreamImpl(service.getInternalIOService(), context->getContext()), - role_(context->getRole()) { +TlsStreamBase(const IOServicePtr& io_service, TlsContextPtr context) + : StreamService(io_service), TlsStreamImpl(io_service->getInternalIOService(), + context->getContext()), role_(context->getRole()) { } /// @brief Botan boost ASIO TLS stream. @@ -128,7 +128,7 @@ public: /// @param service I/O Service object used to manage the stream. /// @param context Pointer to the TLS context. /// @note The caller must not provide a null pointer to the TLS context. - TlsStream(IOService& service, TlsContextPtr context) + TlsStream(const IOServicePtr& service, TlsContextPtr context) : Base(service, context) { } diff --git a/src/lib/asiolink/botan_tls.h b/src/lib/asiolink/botan_tls.h index 0a9b3b16c6..df0ad33767 100644 --- a/src/lib/asiolink/botan_tls.h +++ b/src/lib/asiolink/botan_tls.h @@ -95,8 +95,9 @@ typedef boost::asio::ip::tcp::socket TlsStreamImpl; /// @note The caller must not provide a null pointer to the TLS context. template <typename Callback, typename TlsStreamImpl> TlsStreamBase<Callback, TlsStreamImpl>:: -TlsStreamBase(IOService& service, TlsContextPtr context) - : TlsStreamImpl(service.getInternalIOService()), role_(context->getRole()) { +TlsStreamBase(const IOServicePtr& io_service, TlsContextPtr context) + : StreamService(io_service), TlsStreamImpl(io_service->getInternalIOService()), + role_(context->getRole()) { } /// @brief Botan fake TLS stream. @@ -114,7 +115,7 @@ public: /// @param service I/O Service object used to manage the stream. /// @param context Pointer to the TLS context. /// @note The caller must not provide a null pointer to the TLS context. - TlsStream(IOService& service, TlsContextPtr context) + TlsStream(const IOServicePtr& service, TlsContextPtr context) : Base(service, context) { } diff --git a/src/lib/asiolink/common_tls.h b/src/lib/asiolink/common_tls.h index b119760ebf..87306d9171 100644 --- a/src/lib/asiolink/common_tls.h +++ b/src/lib/asiolink/common_tls.h @@ -118,12 +118,22 @@ public: TlsRole role_; }; +class StreamService { +public: + /// @brief Constructor. + StreamService(const IOServicePtr& io_service) : io_service_(io_service) { + } +private: + /// @brief The IO service used to handle events. + IOServicePtr io_service_; +}; + /// @brief TLS stream base class. /// /// @tparam Callback The type of callbacks. /// @tparam TlsStreamImpl The type of underlying TLS streams. template <typename Callback, typename TlsStreamImpl> -class TlsStreamBase : public TlsStreamImpl { +class TlsStreamBase : public StreamService, public TlsStreamImpl { public: /// @brief Constructor. @@ -131,7 +141,7 @@ public: /// @param service I/O Service object used to manage the stream. /// @param context Pointer to the TLS context. /// @note The caller must not provide a null pointer to the TLS context. - TlsStreamBase(IOService& service, TlsContextPtr context); + TlsStreamBase(const IOServicePtr& service, TlsContextPtr context); /// @brief Destructor. virtual ~TlsStreamBase() { } diff --git a/src/lib/asiolink/interval_timer.cc b/src/lib/asiolink/interval_timer.cc index 72aafe3f79..6226bf1e28 100644 --- a/src/lib/asiolink/interval_timer.cc +++ b/src/lib/asiolink/interval_timer.cc @@ -40,7 +40,7 @@ public: /// @brief Constructor. /// /// @param io_service The IO service used to handle events. - IntervalTimerImpl(IOService& io_service); + IntervalTimerImpl(const IOServicePtr& io_service); /// @brief Destructor. ~IntervalTimerImpl(); @@ -85,6 +85,9 @@ private: /// @brief The interval in milliseconds. std::atomic<long> interval_; + /// @brief The IO service used to handle events. + IOServicePtr io_service_; + /// @brief The asio timer. boost::asio::deadline_timer timer_; @@ -101,8 +104,8 @@ private: static const long INVALIDATED_INTERVAL = -1; }; -IntervalTimerImpl::IntervalTimerImpl(IOService& io_service) : - interval_(0), timer_(io_service.getInternalIOService()), +IntervalTimerImpl::IntervalTimerImpl(const IOServicePtr& io_service) : + interval_(0), io_service_(io_service), timer_(io_service_->getInternalIOService()), mode_(IntervalTimer::REPEATING) { } @@ -173,7 +176,7 @@ IntervalTimerImpl::callback(const boost::system::error_code& ec) { } } -IntervalTimer::IntervalTimer(IOService& io_service) : +IntervalTimer::IntervalTimer(const IOServicePtr& io_service) : impl_(new IntervalTimerImpl(io_service)) { } diff --git a/src/lib/asiolink/interval_timer.h b/src/lib/asiolink/interval_timer.h index 5dc8b71ab3..0475abcadc 100644 --- a/src/lib/asiolink/interval_timer.h +++ b/src/lib/asiolink/interval_timer.h @@ -79,8 +79,8 @@ public: /// memory allocation fails inside the method. /// This constructor may also throw \c boost::system::system_error. /// - /// \param io_service A reference to an instance of IOService - IntervalTimer(IOService& io_service); + /// \param io_service A smart pointer to an instance of IOService + IntervalTimer(const IOServicePtr& io_service); /// \brief The destructor. /// diff --git a/src/lib/asiolink/io_acceptor.h b/src/lib/asiolink/io_acceptor.h index d08bf39d9b..9454ea010d 100644 --- a/src/lib/asiolink/io_acceptor.h +++ b/src/lib/asiolink/io_acceptor.h @@ -37,9 +37,9 @@ public: /// @brief Constructor. /// /// @param io_service Reference to the IO service. - explicit IOAcceptor(IOService& io_service) - : IOSocket(), - acceptor_(new typename ProtocolType::acceptor(io_service.getInternalIOService())) { + explicit IOAcceptor(const IOServicePtr& io_service) + : IOSocket(), io_service_(io_service), + acceptor_(new typename ProtocolType::acceptor(io_service_->getInternalIOService())) { } /// @brief Destructor. @@ -123,13 +123,14 @@ protected: acceptor_->async_accept(socket.getASIOSocket(), callback); } + /// @brief The IO service used to handle events. + IOServicePtr io_service_; /// @brief Underlying ASIO acceptor implementation. boost::shared_ptr<typename ProtocolType::acceptor> acceptor_; }; - } // end of namespace asiolink } // end of isc diff --git a/src/lib/asiolink/io_service_signal.cc b/src/lib/asiolink/io_service_signal.cc index c498702324..d755af4518 100644 --- a/src/lib/asiolink/io_service_signal.cc +++ b/src/lib/asiolink/io_service_signal.cc @@ -27,7 +27,7 @@ public: /// /// @param io_service the process IO service. /// @param handler the signal handler. - IOSignalSetImpl(IOServicePtr io_service, IOSignalHandler handler); + IOSignalSetImpl(const IOServicePtr& io_service, IOSignalHandler handler); /// @brief Destructor. ~IOSignalSetImpl(); @@ -65,7 +65,7 @@ private: void callback(const boost::system::error_code& ec, int signum); }; -IOSignalSetImpl::IOSignalSetImpl(IOServicePtr io_service, +IOSignalSetImpl::IOSignalSetImpl(const IOServicePtr& io_service, IOSignalHandler handler) : io_service_(io_service), signal_set_(io_service_->getInternalIOService()), @@ -122,7 +122,7 @@ IOSignalSetImpl::remove(int signum) { } } -IOSignalSet::IOSignalSet(IOServicePtr io_service, IOSignalHandler handler) : +IOSignalSet::IOSignalSet(const IOServicePtr& io_service, IOSignalHandler handler) : impl_(new IOSignalSetImpl(io_service, handler)) { // It can throw but the error is fatal... impl_->install(); diff --git a/src/lib/asiolink/io_service_signal.h b/src/lib/asiolink/io_service_signal.h index 8fbcbe1660..57db9906d4 100644 --- a/src/lib/asiolink/io_service_signal.h +++ b/src/lib/asiolink/io_service_signal.h @@ -29,7 +29,7 @@ public: /// /// @param io_service IOService to which to send the signal. /// @param handler Handler to call when a signal is received. - IOSignalSet(asiolink::IOServicePtr io_service, IOSignalHandler handler); + IOSignalSet(const asiolink::IOServicePtr& io_service, IOSignalHandler handler); /// @brief Destructor. ~IOSignalSet(); diff --git a/src/lib/asiolink/openssl_tls.h b/src/lib/asiolink/openssl_tls.h index a558fd1044..957d9e5ad2 100644 --- a/src/lib/asiolink/openssl_tls.h +++ b/src/lib/asiolink/openssl_tls.h @@ -117,9 +117,9 @@ typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> TlsStreamImpl; /// @note The caller must not provide a null pointer to the TLS context. template <typename Callback, typename TlsStreamImpl> TlsStreamBase<Callback, TlsStreamImpl>:: -TlsStreamBase(IOService& service, TlsContextPtr context) - : TlsStreamImpl(service.getInternalIOService(), context->getContext()), - role_(context->getRole()) { +TlsStreamBase(const IOServicePtr& io_service, TlsContextPtr context) + : StreamService(io_service), TlsStreamImpl(io_service->getInternalIOService(), + context->getContext()), role_(context->getRole()) { } /// @brief OpenSSL TLS stream. @@ -137,7 +137,7 @@ public: /// @param service I/O Service object used to manage the stream. /// @param context Pointer to the TLS context. /// @note The caller must not provide a null pointer to the TLS context. - TlsStream(IOService& service, TlsContextPtr context) + TlsStream(const IOServicePtr& service, TlsContextPtr context) : Base(service, context) { } diff --git a/src/lib/asiolink/tcp_acceptor.h b/src/lib/asiolink/tcp_acceptor.h index 4fab1ddbbe..58296d86c1 100644 --- a/src/lib/asiolink/tcp_acceptor.h +++ b/src/lib/asiolink/tcp_acceptor.h @@ -35,7 +35,7 @@ public: /// @brief Constructor. /// /// @param io_service IO service. - explicit TCPAcceptor(IOService& io_service) + explicit TCPAcceptor(const IOServicePtr& io_service) : IOAcceptor<boost::asio::ip::tcp, C>(io_service) { } diff --git a/src/lib/asiolink/tcp_socket.h b/src/lib/asiolink/tcp_socket.h index 40a53bec96..c2e70fcfe9 100644 --- a/src/lib/asiolink/tcp_socket.h +++ b/src/lib/asiolink/tcp_socket.h @@ -68,7 +68,7 @@ public: /// socket. In this case, the open() and close() methods are used. /// /// \param service I/O Service object used to manage the socket. - TCPSocket(IOService& service); + TCPSocket(const IOServicePtr& service); /// \brief Destructor virtual ~TCPSocket(); @@ -222,6 +222,10 @@ public: } private: + + /// @brief The IO service used to handle events. + IOServicePtr io_service_; + /// Two variables to hold the socket - a socket and a pointer to it. This /// handles the case where a socket is passed to the TCPSocket on /// construction, or where it is asked to manage its own socket. @@ -261,8 +265,8 @@ TCPSocket<C>::TCPSocket(boost::asio::ip::tcp::socket& socket) : // Constructor - create socket on the fly template <typename C> -TCPSocket<C>::TCPSocket(IOService& service) : - socket_ptr_(new boost::asio::ip::tcp::socket(service.getInternalIOService())), +TCPSocket<C>::TCPSocket(const IOServicePtr& io_service) : io_service_(io_service), + socket_ptr_(new boost::asio::ip::tcp::socket(io_service_->getInternalIOService())), socket_(*socket_ptr_) { } diff --git a/src/lib/asiolink/tests/interval_timer_unittest.cc b/src/lib/asiolink/tests/interval_timer_unittest.cc index c875b06a66..b2cd459ac1 100644 --- a/src/lib/asiolink/tests/interval_timer_unittest.cc +++ b/src/lib/asiolink/tests/interval_timer_unittest.cc @@ -25,7 +25,7 @@ using namespace isc::asiolink; class IntervalTimerTest : public ::testing::Test { protected: IntervalTimerTest() : - io_service_(), timer_called_(false), timer_cancel_success_(false) + io_service_(new IOService()), timer_called_(false), timer_cancel_success_(false) {} ~IntervalTimerTest() {} class TimerCallBack { @@ -33,7 +33,7 @@ protected: TimerCallBack(IntervalTimerTest* test_obj) : test_obj_(test_obj) {} void operator()() const { test_obj_->timer_called_ = true; - test_obj_->io_service_.stop(); + test_obj_->io_service_->stop(); return; } private: @@ -72,7 +72,7 @@ protected: } else if (count_ == 2) { // Second time of call back. // Stop io_service to stop all timers. - test_obj_->io_service_.stop(); + test_obj_->io_service_->stop(); // Compare the value of counter_.counter_ with stored one. // If TimerCallBackCounter was not called (expected behavior), // they are same. @@ -119,7 +119,7 @@ protected: // Second time of call back. // If it reaches here, re-setup() is failed (unexpected). // We should stop here. - test_obj_->io_service_.stop(); + test_obj_->io_service_->stop(); } return; } @@ -143,7 +143,7 @@ protected: int& counter_; }; protected: - IOService io_service_; + IOServicePtr io_service_; bool timer_called_; bool timer_cancel_success_; }; @@ -169,7 +169,7 @@ TEST_F(IntervalTimerTest, startIntervalTimer) { // setup timer itimer.setup(TimerCallBack(this), 100); EXPECT_EQ(100, itimer.getInterval()); - io_service_.run(); + io_service_->run(); // Control reaches here after io_service_ was stopped by TimerCallBack. // delta: difference between elapsed time and 100 milliseconds. @@ -226,7 +226,7 @@ TEST_F(IntervalTimerTest, destructIntervalTimer) { itimer_canceller.setup( TimerCallBackCancelDeleter(this, itimer_counter, callback_canceller), 300); - io_service_.run(); + io_service_->run(); EXPECT_TRUE(timer_cancel_success_); } @@ -238,7 +238,7 @@ TEST_F(IntervalTimerTest, cancel) { unsigned int counter = 0; itimer_counter.setup(TimerCallBackCanceller(counter, itimer_counter), 100); itimer_watcher.setup(TimerCallBack(this), 200); - io_service_.run(); + io_service_->run(); EXPECT_EQ(1, counter); EXPECT_EQ(0, itimer_counter.getInterval()); @@ -255,7 +255,7 @@ TEST_F(IntervalTimerTest, overwriteIntervalTimer) { // - increments internal counter in callback function // (TimerCallBackCounter) // interval: 300 milliseconds - // - io_service_.stop() (TimerCallBack) + // - io_service_->stop() (TimerCallBack) // interval: 100 milliseconds // itimer_overwriter (B) // (Calls TimerCallBackOverwriter) @@ -281,7 +281,7 @@ TEST_F(IntervalTimerTest, overwriteIntervalTimer) { start = boost::posix_time::microsec_clock::universal_time(); itimer.setup(TimerCallBackCounter(this), 300); itimer_overwriter.setup(TimerCallBackOverwriter(this, itimer), 400); - io_service_.run(); + io_service_->run(); // Control reaches here after io_service_ was stopped by // TimerCallBackCounter or TimerCallBackOverwriter. @@ -314,7 +314,7 @@ TEST_F(IntervalTimerTest, intervalModeTest) { // we've hit our goals. It won't return zero unless is out of // work or the service has been stopped by the test timer. int cnt = 0; - while (((cnt = io_service_.runOne()) > 0) && (repeater_count < 5)) { + while (((cnt = io_service_->runOne()) > 0) && (repeater_count < 5)) { // deliberately empty }; @@ -341,7 +341,7 @@ TEST_F(IntervalTimerTest, timerReuseTest) { // Run until a single event handler executes. This should be our // one-shot expiring. - io_service_.runOne(); + io_service_->runOne(); // Verify the timer expired once. ASSERT_EQ(one_shot_count, 1); @@ -351,7 +351,7 @@ TEST_F(IntervalTimerTest, timerReuseTest) { // Run until a single event handler executes. This should be our // one-shot expiring. - io_service_.runOne(); + io_service_->runOne(); // Verify the timer expired once. ASSERT_EQ(one_shot_count, 2); @@ -363,7 +363,7 @@ TEST_F(IntervalTimerTest, timerReuseTest) { // we've hit our goals. It won't return zero unless is out of // work or the service has been stopped by the test timer. int cnt = 0; - while ((cnt = io_service_.runOne()) && (one_shot_count < 4)) { + while ((cnt = io_service_->runOne()) && (one_shot_count < 4)) { // deliberately empty }; diff --git a/src/lib/asiolink/tests/io_service_signal_unittests.cc b/src/lib/asiolink/tests/io_service_signal_unittests.cc index 26e3dc8cdd..721172b6ab 100644 --- a/src/lib/asiolink/tests/io_service_signal_unittests.cc +++ b/src/lib/asiolink/tests/io_service_signal_unittests.cc @@ -50,9 +50,9 @@ public: /// @brief Constructor. IOSignalTest() : - io_service_(new asiolink::IOService()), test_timer_(*io_service_), - test_time_ms_(0), io_signal_set_(), - processed_signals_(), stop_at_count_(0), handler_throw_error_(false) { + io_service_(new asiolink::IOService()), test_timer_(io_service_), + test_time_ms_(0), io_signal_set_(), processed_signals_(), stop_at_count_(0), + handler_throw_error_(false) { io_signal_set_.reset(new IOSignalSet(io_service_, std::bind(&IOSignalTest::processSignal, @@ -118,7 +118,7 @@ TEST_F(IOSignalTest, singleSignalTest) { ASSERT_NO_THROW(io_signal_set_->add(SIGINT)); // Use TimedSignal to generate SIGINT 100 ms after we start IOService::run. - TimedSignal sig_int(*io_service_, SIGINT, 100); + TimedSignal sig_int(io_service_, SIGINT, 100); // The first handler executed is the IOSignal's internal timer expire // callback. @@ -143,7 +143,7 @@ TEST_F(IOSignalTest, singleSignalTest) { ASSERT_NO_THROW(io_signal_set_->remove(SIGINT)); // Use TimedSignal to generate SIGINT 100 ms after we start IOService::run. - TimedSignal sig_int_too_late(*io_service_, SIGINT, 100); + TimedSignal sig_int_too_late(io_service_, SIGINT, 100); // The first handler executed is the IOSignal's internal timer expire // callback. @@ -174,7 +174,7 @@ TEST_F(IOSignalTest, hammer) { // User a repeating TimedSignal so we should generate a signal every 1 ms // until we hit our stop count. - TimedSignal sig_int(*io_service_, SIGINT, 1, + TimedSignal sig_int(io_service_, SIGINT, 1, asiolink::IntervalTimer::REPEATING); // Start processing IO. This should continue until we stop either by @@ -203,7 +203,7 @@ TEST_F(IOSignalTest, handlerThrow) { stop_at_count_ = 1; // Use TimedSignal to generate SIGINT after we start IOService::run. - TimedSignal sig_int(*io_service_, SIGINT, 100, + TimedSignal sig_int(io_service_, SIGINT, 100, asiolink::IntervalTimer::REPEATING); // Set the test flag to cause the handler to throw an exception. @@ -235,14 +235,14 @@ TEST_F(IOSignalTest, mixedSignals) { // Since signal order arrival cannot be guaranteed, we'll use // explicit one shot signals so we can guarantee how many // of each signal we should get. - TimedSignal sig1(*io_service_, SIGINT, 2); - TimedSignal sig2(*io_service_, SIGUSR1, 2); - TimedSignal sig3(*io_service_, SIGINT, 2); - TimedSignal sig4(*io_service_, SIGUSR2, 2); - TimedSignal sig5(*io_service_, SIGINT, 2); - TimedSignal sig6(*io_service_, SIGUSR1, 2); - TimedSignal sig7(*io_service_, SIGINT, 2); - TimedSignal sig8(*io_service_, SIGUSR2, 2); + TimedSignal sig1(io_service_, SIGINT, 2); + TimedSignal sig2(io_service_, SIGUSR1, 2); + TimedSignal sig3(io_service_, SIGINT, 2); + TimedSignal sig4(io_service_, SIGUSR2, 2); + TimedSignal sig5(io_service_, SIGINT, 2); + TimedSignal sig6(io_service_, SIGUSR1, 2); + TimedSignal sig7(io_service_, SIGINT, 2); + TimedSignal sig8(io_service_, SIGUSR2, 2); // Start processing IO. This should continue until we stop either by // hitting the stop count or if things go wrong, max test time. diff --git a/src/lib/asiolink/tests/process_spawn_unittest.cc b/src/lib/asiolink/tests/process_spawn_unittest.cc index 76706543f0..ea7d386bbb 100644 --- a/src/lib/asiolink/tests/process_spawn_unittest.cc +++ b/src/lib/asiolink/tests/process_spawn_unittest.cc @@ -54,7 +54,7 @@ public: /// @brief Constructor. ProcessSpawnTest() : - io_service_(getIOService()), test_timer_(*io_service_), + io_service_(getIOService()), test_timer_(io_service_), test_time_ms_(0), io_signal_set_(), processed_signals_() { io_signal_set_.reset(new IOSignalSet(io_service_, diff --git a/src/lib/asiolink/tests/tcp_acceptor_unittest.cc b/src/lib/asiolink/tests/tcp_acceptor_unittest.cc index 8a4ed06656..5ca4eebcd3 100644 --- a/src/lib/asiolink/tests/tcp_acceptor_unittest.cc +++ b/src/lib/asiolink/tests/tcp_acceptor_unittest.cc @@ -64,8 +64,8 @@ public: /// connect() to connect to the server. /// /// @param io_service IO service to be stopped on error. - explicit TCPClient(IOService& io_service) - : io_service_(io_service.getInternalIOService()), socket_(io_service_) { + explicit TCPClient(const IOServicePtr& io_service) + : io_service_(io_service), socket_(io_service_->getInternalIOService()) { } /// @brief Destructor. @@ -105,7 +105,7 @@ public: if (ec.value() != boost::asio::error::in_progress) { ADD_FAILURE() << "error occurred while connecting: " << ec.message(); - io_service_.stop(); + io_service_->stop(); } } } @@ -117,8 +117,8 @@ public: private: - /// @brief Holds reference to the IO service. - boost::asio::io_service& io_service_; + /// @brief Holds the IO service. + IOServicePtr io_service_; /// @brief A socket used for the connection. boost::asio::ip::tcp::socket socket_; @@ -148,7 +148,7 @@ public: /// @param acceptor Reference to the TCP acceptor on which asyncAccept /// will be called. /// @param callback Callback function for the asyncAccept. - explicit Acceptor(IOService& io_service, TestTCPAcceptor& acceptor, + explicit Acceptor(const IOServicePtr& io_service, TestTCPAcceptor& acceptor, const TCPAcceptorCallback& callback) : socket_(io_service), acceptor_(acceptor), callback_(callback) { } @@ -201,7 +201,7 @@ public: /// against endlessly running IO service when TCP connections are /// unsuccessful. TCPAcceptorTest() - : io_service_(), acceptor_(io_service_), + : io_service_(new IOService()), acceptor_(io_service_), asio_endpoint_(boost::asio::ip::address::from_string(SERVER_ADDRESS), SERVER_PORT), endpoint_(asio_endpoint_), test_timer_(io_service_), connections_(), @@ -284,12 +284,12 @@ public: } else { ++aborted_connections_num_; } - io_service_.stop(); + io_service_->stop(); } // We have reached the maximum number of connections - end the test. if (++connections_num_ >= max_connections_) { - io_service_.stop(); + io_service_->stop(); return; } @@ -301,11 +301,11 @@ public: /// It stops the IO service and reports test timeout. void timeoutHandler() { ADD_FAILURE() << "Timeout occurred while running the test!"; - io_service_.stop(); + io_service_->stop(); } /// @brief IO service. - IOService io_service_; + IOServicePtr io_service_; /// @brief TCPAcceptor under test. TestTCPAcceptor acceptor_; @@ -355,7 +355,7 @@ TEST_F(TCPAcceptorTest, asyncAccept) { // Run the IO service until we have accepted 10 connections, an error // or test timeout occurred. - io_service_.run(); + io_service_->run(); // Make sure that all accepted connections have been recorded. EXPECT_EQ(10, connections_num_); @@ -431,7 +431,7 @@ TEST_F(TCPAcceptorTest, close) { acceptor_.close(); // Run the IO service. - io_service_.run(); + io_service_->run(); // The connections should have been aborted. EXPECT_EQ(1, connections_num_); diff --git a/src/lib/asiolink/tests/tcp_socket_unittest.cc b/src/lib/asiolink/tests/tcp_socket_unittest.cc index 370d71d455..b5b2c6e9d6 100644 --- a/src/lib/asiolink/tests/tcp_socket_unittest.cc +++ b/src/lib/asiolink/tests/tcp_socket_unittest.cc @@ -234,7 +234,7 @@ serverRead(tcp::socket& socket, TCPCallback& server_cb) { TEST(TCPSocket, processReceivedData) { const uint16_t PACKET_SIZE = 16382; // Amount of "real" data in the buffer - IOService service; // Used to instantiate socket + IOServicePtr service(new IOService); // Used to instantiate socket TCPSocket<TCPCallback> test(service); // Socket under test uint8_t inbuff[PACKET_SIZE + 2]; // Buffer to check OutputBufferPtr outbuff(new OutputBuffer(16)); @@ -308,10 +308,10 @@ TEST(TCPSocket, processReceivedData) { TEST(TCPSocket, sequenceTest) { // Common objects. - IOService service; // Service object for async control + IOServicePtr service(new IOService()); // Service object for async control // The client - the TCPSocket being tested - TCPSocket<TCPCallback> client(service);// Socket under test + TCPSocket<TCPCallback> client(service); // Socket under test TCPCallback client_cb("Client"); // Async I/O callback function TCPEndpoint client_remote_endpoint; // Where client receives message from OutputBufferPtr client_buffer(new OutputBuffer(128)); @@ -324,7 +324,7 @@ TEST(TCPSocket, sequenceTest) { TCPEndpoint server_endpoint(server_address, SERVER_PORT); // Endpoint describing server TCPEndpoint server_remote_endpoint; // Address where server received message from - tcp::socket server_socket(service.getInternalIOService()); + tcp::socket server_socket(service->getInternalIOService()); // Socket used for server // Step 1. Create the connection between the client and the server. Set @@ -335,8 +335,8 @@ TEST(TCPSocket, sequenceTest) { server_cb.queued() = TCPCallback::ACCEPT; server_cb.called() = TCPCallback::NONE; server_cb.setCode(42); // Some error - tcp::acceptor acceptor(service.getInternalIOService(), - tcp::endpoint(tcp::v4(), SERVER_PORT)); + tcp::acceptor acceptor(service->getInternalIOService(), + tcp::endpoint(tcp::v4(), SERVER_PORT)); acceptor.set_option(tcp::acceptor::reuse_address(true)); acceptor.async_accept(server_socket, server_cb); @@ -348,8 +348,8 @@ TEST(TCPSocket, sequenceTest) { client.open(&server_endpoint, client_cb); // Run the open and the accept callback and check that they ran. - service.runOne(); - service.runOne(); + service->runOne(); + service->runOne(); EXPECT_EQ(TCPCallback::ACCEPT, server_cb.called()); EXPECT_EQ(0, server_cb.getCode()); @@ -377,7 +377,7 @@ TEST(TCPSocket, sequenceTest) { // Wait for the client callback to complete. (Must do this first on // Solaris: if we do the synchronous read first, the test hangs.) - service.runOne(); + service->runOne(); // Synchronously read the data from the server.; serverRead(server_socket, server_cb); @@ -442,7 +442,7 @@ TEST(TCPSocket, sequenceTest) { bool server_complete = false; bool client_complete = false; while (!server_complete || !client_complete) { - service.runOne(); + service->runOne(); // Has the server run? if (!server_complete) { diff --git a/src/lib/asiolink/tests/tls_acceptor_unittest.cc b/src/lib/asiolink/tests/tls_acceptor_unittest.cc index f7e65e4879..d042566839 100644 --- a/src/lib/asiolink/tests/tls_acceptor_unittest.cc +++ b/src/lib/asiolink/tests/tls_acceptor_unittest.cc @@ -65,8 +65,8 @@ public: /// connect() to connect to the server. /// /// @param io_service IO service to be stopped on error. - explicit TLSClient(IOService& io_service) - : io_service_(io_service.getInternalIOService()), socket_(io_service_) { + explicit TLSClient(const IOServicePtr& io_service) + : io_service_(io_service), socket_(io_service_->getInternalIOService()) { } /// @brief Destructor. @@ -106,7 +106,7 @@ public: if (ec.value() != error::in_progress) { ADD_FAILURE() << "error occurred while connecting: " << ec.message(); - io_service_.stop(); + io_service_->stop(); } } } @@ -119,7 +119,7 @@ public: private: /// @brief Holds reference to the IO service. - io_service& io_service_; + IOServicePtr io_service_; /// @brief A socket used for the connection. ip::tcp::socket socket_; @@ -150,11 +150,11 @@ public: /// @param acceptor Reference to the TLS acceptor on which asyncAccept /// will be called. /// @param callback Callback function for the asyncAccept. - explicit Acceptor(IOService& io_service, + explicit Acceptor(const IOServicePtr& io_service, TlsContextPtr context, TestTLSAcceptor& acceptor, const TLSAcceptorCallback& callback) - : socket_(io_service, context), acceptor_(acceptor), + : io_service_(io_service), socket_(io_service_, context), acceptor_(acceptor), callback_(callback) { } @@ -177,6 +177,9 @@ public: private: + /// @brief IO service used by the tests. + IOServicePtr io_service_; + /// @brief Socket into which connection is accepted. TLSSocket<SocketCallback> socket_; @@ -206,7 +209,7 @@ public: /// against endlessly running IO service when TLS connections are /// unsuccessful. TLSAcceptorTest() - : io_service_(), acceptor_(io_service_), + : io_service_(new IOService()), acceptor_(io_service_), asio_endpoint_(ip::address::from_string(SERVER_ADDRESS), SERVER_PORT), endpoint_(asio_endpoint_), test_timer_(io_service_), connections_(), @@ -290,12 +293,12 @@ public: } else { ++aborted_connections_num_; } - io_service_.stop(); + io_service_->stop(); } // We have reached the maximum number of connections - end the test. if (++connections_num_ >= max_connections_) { - io_service_.stop(); + io_service_->stop(); return; } @@ -307,11 +310,11 @@ public: /// It stops the IO service and reports test timeout. void timeoutHandler() { ADD_FAILURE() << "Timeout occurred while running the test!"; - io_service_.stop(); + io_service_->stop(); } /// @brief IO service. - IOService io_service_; + IOServicePtr io_service_; /// @brief TLSAcceptor under test. TestTLSAcceptor acceptor_; @@ -361,7 +364,7 @@ TEST_F(TLSAcceptorTest, asyncAccept) { // Run the IO service until we have accepted 10 connections, an error // or test timeout occurred. - io_service_.run(); + io_service_->run(); // Make sure that all accepted connections have been recorded. EXPECT_EQ(10, connections_num_); @@ -437,7 +440,7 @@ TEST_F(TLSAcceptorTest, close) { acceptor_.close(); // Run the IO service. - io_service_.run(); + io_service_->run(); // The connections should have been aborted. EXPECT_EQ(1, connections_num_); diff --git a/src/lib/asiolink/tests/tls_socket_unittest.cc b/src/lib/asiolink/tests/tls_socket_unittest.cc index 0c81ec7626..57773f69cb 100644 --- a/src/lib/asiolink/tests/tls_socket_unittest.cc +++ b/src/lib/asiolink/tests/tls_socket_unittest.cc @@ -238,7 +238,7 @@ TEST(TLSSocket, processReceivedData) { const uint16_t PACKET_SIZE = 16382; // Used to instantiate socket - IOService service; + IOServicePtr service(new IOService()); TlsContextPtr context(new TlsContext(CLIENT)); // Socket under test TLSSocket<TLSCallback> test(service, context); @@ -319,7 +319,7 @@ TEST(TLSSocket, sequenceTest) { // Common objects. // Service object for async control - IOService service; + IOServicePtr service(new IOService()); // The client - the TLSSocket being tested TlsContextPtr client_ctx; @@ -344,7 +344,7 @@ TEST(TLSSocket, sequenceTest) { TlsContextPtr server_ctx; test::configServer(server_ctx); // Stream used for server. - TlsStreamImpl server(service.getInternalIOService(), server_ctx->getContext()); + TlsStreamImpl server(service->getInternalIOService(), server_ctx->getContext()); // Step 1. Create the connection between the client and the server. Set // up the server to accept incoming connections and have the client open @@ -354,7 +354,7 @@ TEST(TLSSocket, sequenceTest) { server_cb.queued() = TLSCallback::ACCEPT; server_cb.called() = TLSCallback::NONE; server_cb.setCode(42); // Some error - tcp::acceptor acceptor(service.getInternalIOService(), + tcp::acceptor acceptor(service->getInternalIOService(), tcp::endpoint(tcp::v4(), SERVER_PORT)); acceptor.set_option(tcp::acceptor::reuse_address(true)); acceptor.async_accept(server.lowest_layer(), server_cb); @@ -369,7 +369,7 @@ TEST(TLSSocket, sequenceTest) { // Run the open and the accept callback and check that they ran. while ((server_cb.called() == TLSCallback::NONE) || (client_cb.called() == TLSCallback::NONE)) { - service.runOne(); + service->runOne(); } EXPECT_EQ(TLSCallback::ACCEPT, server_cb.called()); EXPECT_EQ(0, server_cb.getCode()); @@ -398,7 +398,7 @@ TEST(TLSSocket, sequenceTest) { while ((server_cb.called() == TLSCallback::NONE) || (client_cb.called() == TLSCallback::NONE)) { - service.runOne(); + service->runOne(); } EXPECT_EQ(TLSCallback::HANDSHAKE, client_cb.called()); EXPECT_EQ(0, client_cb.getCode()); @@ -419,7 +419,7 @@ TEST(TLSSocket, sequenceTest) { // Wait for the client callback to complete. (Must do this first on // Solaris: if we do the synchronous read first, the test hangs.) while (client_cb.called() == TLSCallback::NONE) { - service.runOne(); + service->runOne(); } // Synchronously read the data from the server.; @@ -486,7 +486,7 @@ TEST(TLSSocket, sequenceTest) { bool server_complete = false; bool client_complete = false; while (!server_complete || !client_complete) { - service.runOne(); + service->runOne(); // Has the server run? if (!server_complete) { diff --git a/src/lib/asiolink/tests/tls_unittest.cc b/src/lib/asiolink/tests/tls_unittest.cc index 68709fbff8..f57b9a47e3 100644 --- a/src/lib/asiolink/tests/tls_unittest.cc +++ b/src/lib/asiolink/tests/tls_unittest.cc @@ -730,7 +730,7 @@ TEST(TLSTest, configureError) { // Test if we can get a stream. TEST(TLSTest, stream) { - IOService service; + IOServicePtr service(new IOService()); TlsContextPtr ctx(new TlsContext(TlsRole::CLIENT)); boost::scoped_ptr<TlsStream<TestCallback> > st; EXPECT_NO_THROW(st.reset(new TlsStream<TestCallback>(service, ctx))); @@ -738,7 +738,7 @@ TEST(TLSTest, stream) { // Test what happens when handshake is forgotten. TEST(TLSTest, noHandshake) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -748,7 +748,7 @@ TEST(TLSTest, noHandshake) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -765,7 +765,7 @@ TEST(TLSTest, noHandshake) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -790,7 +790,7 @@ TEST(TLSTest, noHandshake) { TestCallback send_cb; async_write(client, boost::asio::buffer(send_buf), send_cb); while (!timeout && !send_cb.getCalled()) { - service.runOne(); + service->runOne(); } timer1.cancel(); @@ -817,7 +817,7 @@ TEST(TLSTest, noHandshake) { TestCallback receive_cb; server.async_read_some(boost::asio::buffer(receive_buf), receive_cb); while (!timeout && !receive_cb.getCalled()) { - service.runOne(); + service->runOne(); } timer2.cancel(); @@ -845,7 +845,7 @@ TEST(TLSTest, noHandshake) { // Test what happens when the server was not configured. TEST(TLSTest, serverNotConfigured) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx(new TlsContext(TlsRole::SERVER)); @@ -855,7 +855,7 @@ TEST(TLSTest, serverNotConfigured) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -872,7 +872,7 @@ TEST(TLSTest, serverNotConfigured) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -898,7 +898,7 @@ TEST(TLSTest, serverNotConfigured) { TestCallback client_cb; client.handshake(client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -945,7 +945,7 @@ TEST(TLSTest, serverNotConfigured) { // Test what happens when the client was not configured. TEST(TLSTest, clientNotConfigured) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -955,7 +955,7 @@ TEST(TLSTest, clientNotConfigured) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -972,7 +972,7 @@ TEST(TLSTest, clientNotConfigured) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -998,7 +998,7 @@ TEST(TLSTest, clientNotConfigured) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1044,7 +1044,7 @@ TEST(TLSTest, clientNotConfigured) { // Test what happens when the client is HTTP (vs HTTPS). TEST(TLSTest, clientHTTPnoS) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1054,13 +1054,13 @@ TEST(TLSTest, clientHTTPnoS) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); // Client part. - tcp::socket client(service.getInternalIOService()); + tcp::socket client(service->getInternalIOService()); // Connect to. client.open(tcp::v4()); @@ -1069,7 +1069,7 @@ TEST(TLSTest, clientHTTPnoS) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1099,7 +1099,7 @@ TEST(TLSTest, clientHTTPnoS) { client.async_send(boost::asio::buffer(send_buf), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1139,7 +1139,7 @@ TEST(TLSTest, clientHTTPnoS) { // Test what happens when the client does not use HTTP nor HTTP. TEST(TLSTest, unknownClient) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1149,13 +1149,13 @@ TEST(TLSTest, unknownClient) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); // Client part. - tcp::socket client(service.getInternalIOService()); + tcp::socket client(service->getInternalIOService()); // Connect to. client.open(tcp::v4()); @@ -1164,7 +1164,7 @@ TEST(TLSTest, unknownClient) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1194,7 +1194,7 @@ TEST(TLSTest, unknownClient) { client.async_send(boost::asio::buffer(send_buf), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1230,7 +1230,7 @@ TEST(TLSTest, unknownClient) { // Test what happens when the client uses a certificate from another CA. TEST(TLSTest, anotherClient) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1240,7 +1240,7 @@ TEST(TLSTest, anotherClient) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1257,7 +1257,7 @@ TEST(TLSTest, anotherClient) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1283,7 +1283,7 @@ TEST(TLSTest, anotherClient) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1331,7 +1331,7 @@ TEST(TLSTest, anotherClient) { // Test what happens when the client uses a self-signed certificate. TEST(TLSTest, selfSigned) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1341,7 +1341,7 @@ TEST(TLSTest, selfSigned) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1358,7 +1358,7 @@ TEST(TLSTest, selfSigned) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1384,7 +1384,7 @@ TEST(TLSTest, selfSigned) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1440,7 +1440,7 @@ TEST(TLSTest, selfSigned) { // Test what happens when handshake is forgotten. TEST(TLSTest, noHandshakeCloseonError) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1450,7 +1450,7 @@ TEST(TLSTest, noHandshakeCloseonError) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1467,7 +1467,7 @@ TEST(TLSTest, noHandshakeCloseonError) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1492,7 +1492,7 @@ TEST(TLSTest, noHandshakeCloseonError) { TestCallback send_cb(&client.lowest_layer()); async_write(client, boost::asio::buffer(send_buf), send_cb); while (!timeout && !send_cb.getCalled()) { - service.runOne(); + service->runOne(); } timer1.cancel(); @@ -1519,7 +1519,7 @@ TEST(TLSTest, noHandshakeCloseonError) { TestCallback receive_cb; server.async_read_some(boost::asio::buffer(receive_buf), receive_cb); while (!timeout && !receive_cb.getCalled()) { - service.runOne(); + service->runOne(); } timer2.cancel(); @@ -1543,7 +1543,7 @@ TEST(TLSTest, noHandshakeCloseonError) { // Test what happens when the server was not configured. TEST(TLSTest, serverNotConfiguredCloseonError) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx(new TlsContext(TlsRole::SERVER)); @@ -1553,7 +1553,7 @@ TEST(TLSTest, serverNotConfiguredCloseonError) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1570,7 +1570,7 @@ TEST(TLSTest, serverNotConfiguredCloseonError) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1596,7 +1596,7 @@ TEST(TLSTest, serverNotConfiguredCloseonError) { TestCallback client_cb; client.handshake(client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1642,7 +1642,7 @@ TEST(TLSTest, serverNotConfiguredCloseonError) { // Test what happens when the client was not configured. TEST(TLSTest, clientNotConfiguredCloseonError) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1652,7 +1652,7 @@ TEST(TLSTest, clientNotConfiguredCloseonError) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1669,7 +1669,7 @@ TEST(TLSTest, clientNotConfiguredCloseonError) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1695,7 +1695,7 @@ TEST(TLSTest, clientNotConfiguredCloseonError) { TestCallback client_cb(&client.lowest_layer()); client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1740,7 +1740,7 @@ TEST(TLSTest, clientNotConfiguredCloseonError) { // Test what happens when the client is HTTP (vs HTTPS). TEST(TLSTest, clientHTTPnoSCloseonError) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1750,13 +1750,13 @@ TEST(TLSTest, clientHTTPnoSCloseonError) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); // Client part. - tcp::socket client(service.getInternalIOService()); + tcp::socket client(service->getInternalIOService()); // Connect to. client.open(tcp::v4()); @@ -1765,7 +1765,7 @@ TEST(TLSTest, clientHTTPnoSCloseonError) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1795,7 +1795,7 @@ TEST(TLSTest, clientHTTPnoSCloseonError) { client.async_send(boost::asio::buffer(send_buf), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1835,7 +1835,7 @@ TEST(TLSTest, clientHTTPnoSCloseonError) { // Test what happens when the client uses a certificate from another CA. TEST(TLSTest, anotherClientCloseonError) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1845,7 +1845,7 @@ TEST(TLSTest, anotherClientCloseonError) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1862,7 +1862,7 @@ TEST(TLSTest, anotherClientCloseonError) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1888,7 +1888,7 @@ TEST(TLSTest, anotherClientCloseonError) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -1934,7 +1934,7 @@ TEST(TLSTest, anotherClientCloseonError) { // Test what happens when the client uses a self-signed certificate. TEST(TLSTest, selfSignedCloseonError) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -1944,7 +1944,7 @@ TEST(TLSTest, selfSignedCloseonError) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -1961,7 +1961,7 @@ TEST(TLSTest, selfSignedCloseonError) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -1987,7 +1987,7 @@ TEST(TLSTest, selfSignedCloseonError) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2040,7 +2040,7 @@ TEST(TLSTest, selfSignedCloseonError) { // Test what happens when the client uses a certificate from another CA // but the client certificate request and validation are disabled. TEST(TLSTest, anotherClientNoReq) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -2050,7 +2050,7 @@ TEST(TLSTest, anotherClientNoReq) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2067,7 +2067,7 @@ TEST(TLSTest, anotherClientNoReq) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2093,7 +2093,7 @@ TEST(TLSTest, anotherClientNoReq) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2112,7 +2112,7 @@ TEST(TLSTest, anotherClientNoReq) { // Test what happens when the server uses a certificate without subject // alternative name (but still a version 3 certificate). TEST(TLSTest, serverRaw) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -2122,7 +2122,7 @@ TEST(TLSTest, serverRaw) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2139,7 +2139,7 @@ TEST(TLSTest, serverRaw) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2165,7 +2165,7 @@ TEST(TLSTest, serverRaw) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2185,7 +2185,7 @@ TEST(TLSTest, serverRaw) { // Test what happens when the client uses a trusted self-signed certificate. // Not really a failure case as it works... TEST(TLSTest, trustedSelfSigned) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx; @@ -2195,7 +2195,7 @@ TEST(TLSTest, trustedSelfSigned) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2212,7 +2212,7 @@ TEST(TLSTest, trustedSelfSigned) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2238,7 +2238,7 @@ TEST(TLSTest, trustedSelfSigned) { TestCallback client_cb; client.async_handshake(roleToImpl(TlsRole::CLIENT), client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2263,7 +2263,7 @@ TEST(TLSTest, trustedSelfSigned) { // Test what happens when the shutdown receiver is inactive. TEST(TLSTest, shutdownInactive) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx(new TlsContext(TlsRole::SERVER)); @@ -2273,7 +2273,7 @@ TEST(TLSTest, shutdownInactive) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2290,7 +2290,7 @@ TEST(TLSTest, shutdownInactive) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2316,7 +2316,7 @@ TEST(TLSTest, shutdownInactive) { TestCallback client_cb; client.handshake(client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2336,7 +2336,7 @@ TEST(TLSTest, shutdownInactive) { TestCallback shutdown_cb; client.shutdown(shutdown_cb); while (!timeout && !shutdown_cb.getCalled()) { - service.runOne(); + service->runOne(); } timer2.cancel(); @@ -2361,7 +2361,7 @@ TEST(TLSTest, shutdownInactive) { // Test what happens when the shutdown receiver is active. TEST(TLSTest, shutdownActive) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx(new TlsContext(TlsRole::SERVER)); @@ -2371,7 +2371,7 @@ TEST(TLSTest, shutdownActive) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2388,7 +2388,7 @@ TEST(TLSTest, shutdownActive) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2414,7 +2414,7 @@ TEST(TLSTest, shutdownActive) { TestCallback client_cb; client.handshake(client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2439,7 +2439,7 @@ TEST(TLSTest, shutdownActive) { TestCallback shutdown_cb; client.shutdown(shutdown_cb); while (!timeout && (!shutdown_cb.getCalled() || !receive_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer2.cancel(); @@ -2473,7 +2473,7 @@ TEST(TLSTest, shutdownActive) { // Test what happens when the shutdown receiver is inactive on shutdown // and immediate close. TEST(TLSTest, shutdownCloseInactive) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx(new TlsContext(TlsRole::SERVER)); @@ -2483,7 +2483,7 @@ TEST(TLSTest, shutdownCloseInactive) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2500,7 +2500,7 @@ TEST(TLSTest, shutdownCloseInactive) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2526,7 +2526,7 @@ TEST(TLSTest, shutdownCloseInactive) { TestCallback client_cb; client.handshake(client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2547,9 +2547,9 @@ TEST(TLSTest, shutdownCloseInactive) { client.shutdown(shutdown_cb); // Post a close which should be called after the shutdown. - service.post([&client] { client.lowest_layer().close(); }); + service->post([&client] { client.lowest_layer().close(); }); while (!timeout && !shutdown_cb.getCalled()) { - service.runOne(); + service->runOne(); } timer2.cancel(); @@ -2577,7 +2577,7 @@ TEST(TLSTest, shutdownCloseInactive) { // Test what happens when the shutdown receiver is active with an // immediate close. TEST(TLSTest, shutdownCloseActive) { - IOService service; + IOServicePtr service(new IOService()); // Server part. TlsContextPtr server_ctx(new TlsContext(TlsRole::SERVER)); @@ -2587,7 +2587,7 @@ TEST(TLSTest, shutdownCloseActive) { // Accept a client. tcp::endpoint server_ep(tcp::endpoint(address::from_string(SERVER_ADDRESS), SERVER_PORT)); - tcp::acceptor acceptor(service.getInternalIOService(), server_ep); + tcp::acceptor acceptor(service->getInternalIOService(), server_ep); acceptor.set_option(tcp::acceptor::reuse_address(true)); TestCallback accept_cb; acceptor.async_accept(server.lowest_layer(), accept_cb); @@ -2604,7 +2604,7 @@ TEST(TLSTest, shutdownCloseActive) { // Run accept and connect. while (!accept_cb.getCalled() || !connect_cb.getCalled()) { - service.runOne(); + service->runOne(); } // Verify the error codes. @@ -2630,7 +2630,7 @@ TEST(TLSTest, shutdownCloseActive) { TestCallback client_cb; client.handshake(client_cb); while (!timeout && (!server_cb.getCalled() || !client_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer.cancel(); @@ -2656,9 +2656,9 @@ TEST(TLSTest, shutdownCloseActive) { client.shutdown(shutdown_cb); // Post a close which should be called after the shutdown. - service.post([&client] { client.lowest_layer().close(); }); + service->post([&client] { client.lowest_layer().close(); }); while (!timeout && (!shutdown_cb.getCalled() || !receive_cb.getCalled())) { - service.runOne(); + service->runOne(); } timer2.cancel(); diff --git a/src/lib/asiolink/tests/udp_socket_unittest.cc b/src/lib/asiolink/tests/udp_socket_unittest.cc index cc16d0ae1a..5ef43c167d 100644 --- a/src/lib/asiolink/tests/udp_socket_unittest.cc +++ b/src/lib/asiolink/tests/udp_socket_unittest.cc @@ -158,17 +158,16 @@ private: // two bytes of a buffer. TEST(UDPSocket, processReceivedData) { - IOService service; // Used to instantiate socket - UDPSocket<UDPCallback> test(service); // Socket under test - uint8_t inbuff[32]; // Buffer to check - OutputBufferPtr outbuff(new OutputBuffer(16)); - // Where data is put - // cppcheck-suppress variableScope - size_t expected; // Expected amount of data - // cppcheck-suppress variableScope - size_t offset; // Where to put next data - // cppcheck-suppress variableScope - size_t cumulative; // Cumulative data received + IOServicePtr service(new IOService()); // Used to instantiate socket + UDPSocket<UDPCallback> test(service); // Socket under test + uint8_t inbuff[32]; // Buffer to check + OutputBufferPtr outbuff(new OutputBuffer(16)); // Where data is put + // cppcheck-suppress variableScope + size_t expected; // Expected amount of data + // cppcheck-suppress variableScope + size_t offset; // Where to put next data + // cppcheck-suppress variableScope + size_t cumulative; // Cumulative data received // Set some dummy values in the buffer to check for (uint8_t i = 0; i < sizeof(inbuff); ++i) { @@ -206,31 +205,27 @@ TEST(UDPSocket, processReceivedData) { // message to a server, receiving an asynchronous message from the server and // closing. TEST(UDPSocket, SequenceTest) { - // Common objects. - IOService service; // Service object for async control - + IOServicePtr service(new IOService()); // Service object for async control // Server - IOAddress server_address(SERVER_ADDRESS); // Address of target server - UDPCallback server_cb("Server"); // Server callback - UDPEndpoint server_endpoint( // Endpoint describing server - server_address, SERVER_PORT); - UDPEndpoint server_remote_endpoint; // Address where server received message from + IOAddress server_address(SERVER_ADDRESS); // Address of target server + UDPCallback server_cb("Server"); // Server callback + UDPEndpoint server_endpoint(server_address, SERVER_PORT); // Endpoint describing server + UDPEndpoint server_remote_endpoint; // Address where server received message from // The client - the UDPSocket being tested - UDPSocket<UDPCallback> client(service);// Socket under test - UDPCallback client_cb("Client"); // Async I/O callback function - UDPEndpoint client_remote_endpoint; // Where client receives message from - size_t client_cumulative = 0; // Cumulative data received - size_t client_offset = 0; // Offset into buffer where data is put - size_t client_expected = 0; // Expected amount of data - OutputBufferPtr client_buffer(new OutputBuffer(16)); - // Where data is put + UDPSocket<UDPCallback> client(service); // Socket under test + UDPCallback client_cb("Client"); // Async I/O callback function + UDPEndpoint client_remote_endpoint; // Where client receives message from + size_t client_cumulative = 0; // Cumulative data received + size_t client_offset = 0; // Offset into buffer where data is put + size_t client_expected = 0; // Expected amount of data + OutputBufferPtr client_buffer(new OutputBuffer(16)); // Where data is put // The server - with which the client communicates. For convenience, we // use the same io_service, and use the endpoint object created for // the client to send to as the endpoint object in the constructor. - boost::asio::ip::udp::socket server(service.getInternalIOService(), + boost::asio::ip::udp::socket server(service->getInternalIOService(), server_endpoint.getASIOEndpoint()); server.set_option(socket_base::reuse_address(true)); @@ -250,15 +245,15 @@ TEST(UDPSocket, SequenceTest) { EXPECT_FALSE(server_cb.getCalled()); // Write something to the server using the client - the callback should not - // be called until we call the io_service.run() method. + // be called until we call the io_service->run() method. client_cb.setCalled(false); client_cb.setCode(7); // Arbitrary number client.asyncSend(OUTBOUND_DATA, sizeof(OUTBOUND_DATA), &server_endpoint, client_cb); EXPECT_FALSE(client_cb.getCalled()); // Execute the two callbacks. - service.runOne(); - service.runOne(); + service->runOne(); + service->runOne(); EXPECT_TRUE(client_cb.getCalled()); EXPECT_EQ(0, client_cb.getCode()); @@ -286,8 +281,8 @@ TEST(UDPSocket, SequenceTest) { server_remote_endpoint.getASIOEndpoint(), server_cb); // Expect two callbacks to run. - service.runOne(); - service.runOne(); + service->runOne(); + service->runOne(); EXPECT_TRUE(client_cb.getCalled()); EXPECT_EQ(0, client_cb.getCode()); diff --git a/src/lib/asiolink/tests/unix_domain_socket_unittest.cc b/src/lib/asiolink/tests/unix_domain_socket_unittest.cc index 033c80375a..b237d0cf13 100644 --- a/src/lib/asiolink/tests/unix_domain_socket_unittest.cc +++ b/src/lib/asiolink/tests/unix_domain_socket_unittest.cc @@ -33,7 +33,7 @@ public: /// /// Removes unix socket descriptor before the test. UnixDomainSocketTest() : - io_service_(), + io_service_(new IOService()), test_socket_(new test::TestServerUnixSocket(io_service_, unixSocketFilePath())), response_(), @@ -105,7 +105,7 @@ public: } /// @brief IO service used by the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Server side unix socket used in these tests. test::TestServerUnixSocketPtr test_socket_; @@ -138,7 +138,7 @@ TEST_F(UnixDomainSocketTest, sendReceive) { // Run IO service to generate server's response. while ((test_socket_->getResponseNum() < 1) && (!test_socket_->isStopped())) { - io_service_.runOne(); + io_service_->runOne(); } // Receive response from the socket. @@ -179,7 +179,7 @@ TEST_F(UnixDomainSocketTest, asyncSendReceive) { )); // Run IO service until connect handler is invoked. while (!connect_handler_invoked && (!test_socket_->isStopped())) { - io_service_.runOne(); + io_service_->runOne(); } // We are going to asynchronously send the 'foo' over the unix socket. @@ -202,7 +202,7 @@ TEST_F(UnixDomainSocketTest, asyncSendReceive) { // Run IO service to generate server's response. while ((test_socket_->getResponseNum() < 1) && (!test_socket_->isStopped())) { - io_service_.runOne(); + io_service_->runOne(); } // There is no guarantee that all data have been sent so we only check that @@ -215,7 +215,7 @@ TEST_F(UnixDomainSocketTest, asyncSendReceive) { // Run IO service until we get the full response from the server. while ((response_.size() < expected_response.size()) && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } // Check that the entire response has been received and is correct. @@ -259,7 +259,7 @@ TEST_F(UnixDomainSocketTest, asyncClientErrors) { EXPECT_TRUE(ec); }); while (!connect_handler_invoked && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } // Send @@ -272,7 +272,7 @@ TEST_F(UnixDomainSocketTest, asyncClientErrors) { EXPECT_TRUE(ec); }); while (!send_handler_invoked && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } // Receive @@ -285,7 +285,7 @@ TEST_F(UnixDomainSocketTest, asyncClientErrors) { EXPECT_TRUE(ec); }); while (!receive_handler_invoked && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } } diff --git a/src/lib/asiolink/testutils/test_server_unix_socket.cc b/src/lib/asiolink/testutils/test_server_unix_socket.cc index 93d53d96d5..9df24be1b2 100644 --- a/src/lib/asiolink/testutils/test_server_unix_socket.cc +++ b/src/lib/asiolink/testutils/test_server_unix_socket.cc @@ -142,7 +142,7 @@ public: /// @brief Constructor. /// /// @param io_service Reference to the IO service. - ConnectionPool(IOService& io_service) + ConnectionPool(IOServicePtr& io_service) : io_service_(io_service), connections_(), next_socket_(), response_num_(0) { } @@ -160,7 +160,7 @@ public: /// @return Pointer to the socket. UnixSocketPtr getSocket() { if (!next_socket_) { - next_socket_.reset(new UnixSocket(io_service_.getInternalIOService())); + next_socket_.reset(new UnixSocket(io_service_->getInternalIOService())); } return (next_socket_); } @@ -206,8 +206,8 @@ public: private: - /// @brief Reference to the IO service. - IOService& io_service_; + /// @brief Pointer to the IO service. + IOServicePtr io_service_; /// @brief Container holding established connections. std::set<ConnectionPtr> connections_; @@ -222,15 +222,15 @@ private: }; -TestServerUnixSocket::TestServerUnixSocket(IOService& io_service, +TestServerUnixSocket::TestServerUnixSocket(const IOServicePtr& io_service, const std::string& socket_file_path, const std::string& custom_response) : io_service_(io_service), server_endpoint_(socket_file_path), - server_acceptor_(io_service_.getInternalIOService()), + server_acceptor_(io_service_->getInternalIOService()), test_timer_(io_service_), custom_response_(custom_response), - connection_pool_(new ConnectionPool(io_service)), + connection_pool_(new ConnectionPool(io_service_)), stopped_(false), running_(false) { } @@ -274,8 +274,7 @@ TestServerUnixSocket::bindServerSocket(const bool use_thread) { // when the thread has already started and the IO service is running. The // main thread can move forward when it receives this signal from the handler. if (use_thread) { - io_service_.post(std::bind(&TestServerUnixSocket::signalRunning, - this)); + io_service_->post(std::bind(&TestServerUnixSocket::signalRunning, this)); } } @@ -292,8 +291,7 @@ TestServerUnixSocket::acceptHandler(const boost::system::error_code& ec) { void TestServerUnixSocket::accept() { server_acceptor_.async_accept(*(connection_pool_->getSocket()), - std::bind(&TestServerUnixSocket::acceptHandler, this, - ph::_1)); // error + std::bind(&TestServerUnixSocket::acceptHandler, this, ph::_1)); // error } void @@ -316,7 +314,7 @@ TestServerUnixSocket::waitForRunning() { void TestServerUnixSocket::timeoutHandler() { ADD_FAILURE() << "Timeout occurred while running the test!"; - io_service_.stop(); + io_service_->stop(); stopped_ = true; } diff --git a/src/lib/asiolink/testutils/test_server_unix_socket.h b/src/lib/asiolink/testutils/test_server_unix_socket.h index cf156738c2..2b00aa40f7 100644 --- a/src/lib/asiolink/testutils/test_server_unix_socket.h +++ b/src/lib/asiolink/testutils/test_server_unix_socket.h @@ -53,7 +53,7 @@ public: /// @param io_service IO service. /// @param socket_file_path Socket file path. /// @param custom_response Custom response to be sent to the client. - TestServerUnixSocket(IOService& io_service, + TestServerUnixSocket(const IOServicePtr& io_service, const std::string& socket_file_path, const std::string& custom_response = ""); @@ -123,7 +123,7 @@ private: void signalRunning(); /// @brief IO service used by the tests. - IOService& io_service_; + IOServicePtr io_service_; /// @brief Server endpoint. boost::asio::local::stream_protocol::endpoint server_endpoint_; diff --git a/src/lib/asiolink/testutils/timed_signal.h b/src/lib/asiolink/testutils/timed_signal.h index f1cd0c9775..0b949223b7 100644 --- a/src/lib/asiolink/testutils/timed_signal.h +++ b/src/lib/asiolink/testutils/timed_signal.h @@ -31,7 +31,7 @@ public: /// raised. /// @param mode selects between a one-shot signal or a signal which repeats /// at "milliseconds" interval. - TimedSignal(asiolink::IOService& io_service, int signum, int milliseconds, + TimedSignal(asiolink::IOServicePtr& io_service, int signum, int milliseconds, const asiolink::IntervalTimer::Mode& mode = asiolink::IntervalTimer::ONE_SHOT) : timer_(new asiolink::IntervalTimer(io_service)) { diff --git a/src/lib/asiolink/tls_acceptor.h b/src/lib/asiolink/tls_acceptor.h index c5755592c0..1acac5ce3d 100644 --- a/src/lib/asiolink/tls_acceptor.h +++ b/src/lib/asiolink/tls_acceptor.h @@ -34,7 +34,7 @@ public: /// @brief Constructor. /// /// @param io_service IO service. - explicit TLSAcceptor(IOService& io_service) : TCPAcceptor<C>(io_service) { + explicit TLSAcceptor(const IOServicePtr& io_service) : TCPAcceptor<C>(io_service) { } /// @brief Destructor. diff --git a/src/lib/asiolink/tls_socket.h b/src/lib/asiolink/tls_socket.h index cdd2f78d0c..179952d98f 100644 --- a/src/lib/asiolink/tls_socket.h +++ b/src/lib/asiolink/tls_socket.h @@ -42,7 +42,7 @@ public: /// /// @param service I/O Service object used to manage the socket. /// @param context Pointer to TLS context. - TLSSocket(IOService& service, TlsContextPtr context); + TLSSocket(const IOServicePtr& service, TlsContextPtr context); /// @brief Destructor. virtual ~TLSSocket() { } @@ -224,6 +224,9 @@ public: } private: + /// @brief The IO service used to handle events. + IOServicePtr io_service_; + /// Two variables to hold the stream - a stream and a pointer to it. This /// handles the case where a stream is passed to the TLSSocket on /// construction, or where it is asked to manage its own stream. @@ -266,10 +269,10 @@ TLSSocket<C>::TLSSocket(TlsStream<C>& stream) : // Constructor - create socket on the fly. template <typename C> -TLSSocket<C>::TLSSocket(IOService& service, TlsContextPtr context) : - stream_ptr_(new TlsStream<C>(service, context)), - stream_(*stream_ptr_), socket_(stream_.lowest_layer()), send_buffer_() -{ +TLSSocket<C>::TLSSocket(const IOServicePtr& io_service, TlsContextPtr context) + : io_service_(io_service), + stream_ptr_(new TlsStream<C>(io_service, context)), + stream_(*stream_ptr_), socket_(stream_.lowest_layer()), send_buffer_() { } // Open the socket. diff --git a/src/lib/asiolink/udp_socket.h b/src/lib/asiolink/udp_socket.h index 095ede4576..68adb351d8 100644 --- a/src/lib/asiolink/udp_socket.h +++ b/src/lib/asiolink/udp_socket.h @@ -56,7 +56,7 @@ public: /// socket. In this case, the open() and close() methods are used. /// /// \param service I/O Service object used to manage the socket. - UDPSocket(IOService& service); + UDPSocket(const IOServicePtr& service); /// \brief Destructor virtual ~UDPSocket(); @@ -147,6 +147,9 @@ public: private: + /// @brief The IO service used to handle events. + IOServicePtr io_service_; + // Two variables to hold the socket - a socket and a pointer to it. This // handles the case where a socket is passed to the UDPSocket on // construction, or where it is asked to manage its own socket. @@ -172,8 +175,8 @@ UDPSocket<C>::UDPSocket(boost::asio::ip::udp::socket& socket) : // Constructor - create socket on the fly template <typename C> -UDPSocket<C>::UDPSocket(IOService& service) : - socket_ptr_(new boost::asio::ip::udp::socket(service.getInternalIOService())), +UDPSocket<C>::UDPSocket(const IOServicePtr& io_service) : io_service_(io_service), + socket_ptr_(new boost::asio::ip::udp::socket(io_service_->getInternalIOService())), socket_(*socket_ptr_), isopen_(false) { } diff --git a/src/lib/asiolink/unix_domain_socket.cc b/src/lib/asiolink/unix_domain_socket.cc index e5c3dd27ad..12efab3917 100644 --- a/src/lib/asiolink/unix_domain_socket.cc +++ b/src/lib/asiolink/unix_domain_socket.cc @@ -25,8 +25,8 @@ public: /// @brief Constructor. /// /// @param io_service IO service to be used by the socket class. - UnixDomainSocketImpl(IOService& io_service) - : socket_(io_service.getInternalIOService()) { + UnixDomainSocketImpl(const IOServicePtr& io_service) + : io_service_(io_service), socket_(io_service_->getInternalIOService()) { } /// @brief Destructor. @@ -159,6 +159,9 @@ public: /// @brief Closes the socket. void close(); + /// @brief The IO service used to handle events. + IOServicePtr io_service_; + /// @brief Instance of the boost asio unix domain socket. stream_protocol::socket socket_; }; @@ -280,7 +283,7 @@ UnixDomainSocketImpl::close() { } } -UnixDomainSocket::UnixDomainSocket(IOService& io_service) +UnixDomainSocket::UnixDomainSocket(const IOServicePtr& io_service) : impl_(new UnixDomainSocketImpl(io_service)) { } diff --git a/src/lib/asiolink/unix_domain_socket.h b/src/lib/asiolink/unix_domain_socket.h index cd02f41e56..b0f4358bff 100644 --- a/src/lib/asiolink/unix_domain_socket.h +++ b/src/lib/asiolink/unix_domain_socket.h @@ -41,7 +41,7 @@ public: /// /// @param io_service Reference to IOService to be used by this /// class. - explicit UnixDomainSocket(IOService& io_service); + explicit UnixDomainSocket(const IOServicePtr& io_service); /// @brief Returns native socket representation. virtual int getNative() const; diff --git a/src/lib/asiolink/unix_domain_socket_acceptor.h b/src/lib/asiolink/unix_domain_socket_acceptor.h index 8aa11cadca..aa3d04ea71 100644 --- a/src/lib/asiolink/unix_domain_socket_acceptor.h +++ b/src/lib/asiolink/unix_domain_socket_acceptor.h @@ -32,7 +32,7 @@ public: /// @brief Constructor. /// /// @param io_service Reference to the IO service. - explicit UnixDomainSocketAcceptor(IOService& io_service) + explicit UnixDomainSocketAcceptor(const IOServicePtr& io_service) : IOAcceptor<boost::asio::local::stream_protocol, std::function<void(const boost::system::error_code&)> >(io_service) { } diff --git a/src/lib/config/client_connection.cc b/src/lib/config/client_connection.cc index 6217c1aae1..6f53eca261 100644 --- a/src/lib/config/client_connection.cc +++ b/src/lib/config/client_connection.cc @@ -27,7 +27,7 @@ public: /// @brief Constructor. /// /// @param io_service Reference to the IO service. - explicit ClientConnectionImpl(IOService& io_service); + explicit ClientConnectionImpl(const IOServicePtr& io_service); /// @brief This method schedules timer or reschedules existing timer. /// @@ -115,7 +115,7 @@ private: long timeout_; }; -ClientConnectionImpl::ClientConnectionImpl(IOService& io_service) +ClientConnectionImpl::ClientConnectionImpl(const IOServicePtr& io_service) : socket_(io_service), feed_(), current_command_(), timer_(io_service), timeout_(0) { } @@ -268,7 +268,7 @@ ClientConnectionImpl::timeoutCallback(ClientConnection::Handler handler) { terminate(boost::asio::error::timed_out, handler); } -ClientConnection::ClientConnection(asiolink::IOService& io_service) +ClientConnection::ClientConnection(const IOServicePtr& io_service) : impl_(new ClientConnectionImpl(io_service)) { } @@ -280,6 +280,5 @@ ClientConnection::start(const ClientConnection::SocketPath& socket_path, impl_->start(socket_path, command, handler, timeout); } - } // end of namespace config } // end of namespace isc diff --git a/src/lib/config/client_connection.h b/src/lib/config/client_connection.h index b88854bcd8..0cd25c66b5 100644 --- a/src/lib/config/client_connection.h +++ b/src/lib/config/client_connection.h @@ -108,7 +108,7 @@ public: /// @brief Constructor. /// /// @param io_service Reference to the IO service. - explicit ClientConnection(asiolink::IOService& io_service); + explicit ClientConnection(const asiolink::IOServicePtr& io_service); /// @brief Starts asynchronous transaction with a remote endpoint. /// diff --git a/src/lib/config/cmd_http_listener.cc b/src/lib/config/cmd_http_listener.cc index aa917c7824..e02f65eec0 100644 --- a/src/lib/config/cmd_http_listener.cc +++ b/src/lib/config/cmd_http_listener.cc @@ -62,7 +62,7 @@ CmdHttpListener::start() { // Create the HTTP listener. It will open up a TCP socket and be // prepared to accept incoming connections. - http_listener_.reset(new HttpListener(*thread_io_service_, address_, + http_listener_.reset(new HttpListener(thread_io_service_, address_, port_, tls_context_, rcf, HttpListener::RequestTimeout(TIMEOUT_AGENT_RECEIVE_COMMAND), HttpListener::IdleTimeout(TIMEOUT_AGENT_IDLE_CONNECTION_TIMEOUT))); diff --git a/src/lib/config/command_mgr.cc b/src/lib/config/command_mgr.cc index 8dcb84072a..cf21a697ab 100644 --- a/src/lib/config/command_mgr.cc +++ b/src/lib/config/command_mgr.cc @@ -67,7 +67,7 @@ public: const boost::shared_ptr<UnixDomainSocket>& socket, ConnectionPool& connection_pool, const long timeout) - : socket_(socket), timeout_timer_(*io_service), timeout_(timeout), + : socket_(socket), timeout_timer_(io_service), timeout_(timeout), buf_(), response_(), connection_pool_(connection_pool), feed_(), response_in_progress_(false), watch_socket_(new util::WatchSocket()) { @@ -181,7 +181,6 @@ public: void receiveHandler(const boost::system::error_code& ec, size_t bytes_transferred); - /// @brief Handler invoked when the data is sent over the control socket. /// /// If there are still data to be sent, another asynchronous send is @@ -463,7 +462,6 @@ Connection::timeoutHandler() { doSend(); } - } namespace isc { @@ -575,7 +573,7 @@ CommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_info) try { // Start asynchronous acceptor service. - acceptor_.reset(new UnixDomainSocketAcceptor(*io_service_)); + acceptor_.reset(new UnixDomainSocketAcceptor(io_service_)); UnixDomainSocketEndpoint endpoint(socket_name_); acceptor_->open(endpoint); acceptor_->bind(endpoint); @@ -593,7 +591,7 @@ CommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_info) void CommandMgrImpl::doAccept() { // Create a socket into which the acceptor will accept new connection. - socket_.reset(new UnixDomainSocket(*io_service_)); + socket_.reset(new UnixDomainSocket(io_service_)); acceptor_->asyncAccept(*socket_, [this](const boost::system::error_code& ec) { if (!ec) { // New connection is arriving. Start asynchronous transmission. @@ -644,7 +642,6 @@ CommandMgr::getControlSocketFD() { return (impl_->acceptor_ ? impl_->acceptor_->getNative() : -1); } - CommandMgr& CommandMgr::instance() { static CommandMgr cmd_mgr; @@ -661,6 +658,5 @@ CommandMgr::setConnectionTimeout(const long timeout) { impl_->timeout_ = timeout; } - -}; // end of isc::config -}; // end of isc +} // end of isc::config +} // end of isc diff --git a/src/lib/config/tests/client_connection_unittests.cc b/src/lib/config/tests/client_connection_unittests.cc index 9e57575fb6..38597ce810 100644 --- a/src/lib/config/tests/client_connection_unittests.cc +++ b/src/lib/config/tests/client_connection_unittests.cc @@ -33,7 +33,7 @@ public: /// /// Removes unix socket descriptor before the test. ClientConnectionTest() : - io_service_(), + io_service_(new IOService()), test_socket_(new test::TestServerUnixSocket(io_service_, unixSocketFilePath())) { removeUnixSocketFile(); @@ -76,7 +76,7 @@ public: } /// @brief IO service used by the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Server side unix socket used in these tests. test::TestServerUnixSocketPtr test_socket_; @@ -116,7 +116,7 @@ TEST_F(ClientConnectionTest, success) { }); // Run the connection. while (!handler_invoked && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } } @@ -153,7 +153,7 @@ TEST_F(ClientConnectionTest, timeout) { }, ClientConnection::Timeout(1000)); while (!handler_invoked && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } } @@ -176,7 +176,7 @@ TEST_F(ClientConnectionTest, connectionError) { }); while (!handler_invoked && !test_socket_->isStopped()) { - io_service_.runOne(); + io_service_->runOne(); } } diff --git a/src/lib/config/tests/cmd_http_listener_unittests.cc b/src/lib/config/tests/cmd_http_listener_unittests.cc index 0093980411..fbb5c8ac79 100644 --- a/src/lib/config/tests/cmd_http_listener_unittests.cc +++ b/src/lib/config/tests/cmd_http_listener_unittests.cc @@ -54,7 +54,7 @@ public: /// Starts test timer which detects timeouts, deregisters all commands /// from CommandMgr, and enables multi-threading mode. CmdHttpListenerTest() - : listener_(), io_service_(), test_timer_(io_service_), + : listener_(), io_service_(new IOService()), test_timer_(io_service_), run_io_service_timer_(io_service_), clients_(), num_threads_(), num_clients_(), num_in_progress_(0), num_finished_(0), chunk_size_(0), pause_cnt_(0) { @@ -171,7 +171,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Runs IO service with optional timeout. @@ -192,10 +192,10 @@ public: size_t num_done = 0; while (num_done != request_limit) { // Always call restart() before we call run(); - io_service_.restart(); + io_service_->restart(); // Run until a client stops the service. - io_service_.run(); + io_service_->run(); // If all the clients are done receiving, the test is done. num_done = 0; @@ -687,7 +687,7 @@ public: CmdHttpListenerPtr listener_; /// @brief IO service used in drive the test and test clients. - IOService io_service_; + IOServicePtr io_service_; /// @brief Asynchronous timer service to detect timeouts. IntervalTimer test_timer_; diff --git a/src/lib/d2srv/dns_client.cc b/src/lib/d2srv/dns_client.cc index 5798207670..4467577dc2 100644 --- a/src/lib/d2srv/dns_client.cc +++ b/src/lib/d2srv/dns_client.cc @@ -100,7 +100,7 @@ public: /// @param tsig_key A pointer to an @c D2TsigKeyPtr object that will /// (if not null) be used to sign the DNS Update message and verify the /// response. - void doUpdate(asiolink::IOService& io_service, + void doUpdate(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& ns_addr, const uint16_t ns_port, D2UpdateMessage& update, @@ -222,7 +222,7 @@ DNSClientImpl::getStatus(const asiodns::IOFetch::Result result) { } void -DNSClientImpl::doUpdate(asiolink::IOService& io_service, +DNSClientImpl::doUpdate(const asiolink::IOServicePtr& io_service, const IOAddress& ns_addr, const uint16_t ns_port, D2UpdateMessage& update, @@ -275,7 +275,7 @@ DNSClientImpl::doUpdate(asiolink::IOService& io_service, // Post the task to the task queue in the IO service. Caller will actually // run these tasks by executing IOService::run. - io_service.post(io_fetch); + io_service->post(io_fetch); // Update sent statistics. incrStats("update-sent"); @@ -311,7 +311,7 @@ DNSClient::getMaxTimeout() { } void -DNSClient::doUpdate(asiolink::IOService& io_service, +DNSClient::doUpdate(const asiolink::IOServicePtr& io_service, const IOAddress& ns_addr, const uint16_t ns_port, D2UpdateMessage& update, diff --git a/src/lib/d2srv/dns_client.h b/src/lib/d2srv/dns_client.h index c63a7a0c0a..63a2c5c16a 100644 --- a/src/lib/d2srv/dns_client.h +++ b/src/lib/d2srv/dns_client.h @@ -139,7 +139,7 @@ public: /// @param tsig_key A pointer to an @c D2TsigKeyPtr object that will /// (if not null) be used to sign the DNS Update message and verify the /// response. - void doUpdate(asiolink::IOService& io_service, + void doUpdate(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& ns_addr, const uint16_t ns_port, D2UpdateMessage& update, diff --git a/src/lib/d2srv/nc_trans.cc b/src/lib/d2srv/nc_trans.cc index e9534c256c..e9adce5432 100644 --- a/src/lib/d2srv/nc_trans.cc +++ b/src/lib/d2srv/nc_trans.cc @@ -197,7 +197,7 @@ NameChangeTransaction::sendUpdate(const std::string& comment) { // for the current server. If not we would need to add that. D2ParamsPtr d2_params = cfg_mgr_->getD2Params(); - dns_client_->doUpdate(*io_service_, current_server_->getIpAddress(), + dns_client_->doUpdate(io_service_, current_server_->getIpAddress(), current_server_->getPort(), *dns_update_request_, d2_params->getDnsServerTimeout(), tsig_key_); // Message is on its way, so the next event should be NOP_EVT. diff --git a/src/lib/d2srv/tests/dns_client_unittests.cc b/src/lib/d2srv/tests/dns_client_unittests.cc index 76a02a0379..9ffe0963e1 100644 --- a/src/lib/d2srv/tests/dns_client_unittests.cc +++ b/src/lib/d2srv/tests/dns_client_unittests.cc @@ -60,7 +60,7 @@ class DNSClientTest : public ::testing::Test, DNSClient::Callback, public D2StatTest { public: /// @brief The IOService which handles IO operations. - IOService service_; + IOServicePtr service_; /// @brief The UDP socket. std::unique_ptr<udp::socket> socket_; @@ -107,7 +107,7 @@ public: /// waiting for a response. Some of the tests are checking DNSClient behavior /// in case when response from the server is not received. Tests output would /// become messy if such errors were logged. - DNSClientTest() : service_(), socket_(), endpoint_(), + DNSClientTest() : service_(new IOService()), socket_(), endpoint_(), status_(DNSClient::SUCCESS), corrupt_response_(false), expect_response_(true), test_timer_(service_), received_(0), expected_(0), go_on_(false) { @@ -136,7 +136,7 @@ public: virtual void operator()(DNSClient::Status status) { status_ = status; if (!expected_ || (expected_ == ++received_)) { - service_.stop(); + service_->stop(); } if (expect_response_) { @@ -168,7 +168,7 @@ public: /// /// This callback stops all running (hanging) tasks on IO service. void testTimeoutHandler() { - service_.stop(); + service_->stop(); FAIL() << "Test timeout hit."; } @@ -367,7 +367,7 @@ public: // This starts the execution of tasks posted to IOService. run() blocks // until stop() is called in the completion callback function. - service_.run(); + service_->run(); } @@ -392,7 +392,7 @@ public: // responses. The reuse address option is set so as both sockets can // use the same address. This new socket is bound to the test address // and port, where requests will be sent. - socket_.reset(new udp::socket(service_.getInternalIOService(), + socket_.reset(new udp::socket(service_->getInternalIOService(), boost::asio::ip::udp::v4())); socket_->set_option(socket_base::reuse_address(true)); socket_->bind(udp::endpoint(address::from_string(TEST_ADDRESS), @@ -437,14 +437,14 @@ public: // Kick of the message exchange by actually running the scheduled // "send" and "receive" operations. - service_.run(); + service_->run(); socket_->close(); // Since the callback, operator(), calls stop() on the io_service, // we must reset it in order for subsequent calls to run() or // runOne() to work. - service_.restart(); + service_->restart(); } /// @brief Performs a single request-response exchange with or without TSIG. @@ -465,7 +465,7 @@ public: ASSERT_NO_THROW(message.setZone(Name("example.com"), RRClass::IN())); // Setup our "loopback" server. - udp::socket udp_socket(service_.getInternalIOService(), boost::asio::ip::udp::v4()); + udp::socket udp_socket(service_->getInternalIOService(), boost::asio::ip::udp::v4()); udp_socket.set_option(socket_base::reuse_address(true)); udp_socket.bind(udp::endpoint(address::from_string(TEST_ADDRESS), TEST_PORT)); @@ -489,14 +489,14 @@ public: // Kick of the message exchange by actually running the scheduled // "send" and "receive" operations. - service_.run(); + service_->run(); udp_socket.close(); // Since the callback, operator(), calls stop() on the io_service, // we must reset it in order for subsequent calls to run() or // runOne() to work. - service_.restart(); + service_->restart(); } }; diff --git a/src/lib/d2srv/tests/nc_trans_unittests.cc b/src/lib/d2srv/tests/nc_trans_unittests.cc index 89a23b7806..e1df8e27e6 100644 --- a/src/lib/d2srv/tests/nc_trans_unittests.cc +++ b/src/lib/d2srv/tests/nc_trans_unittests.cc @@ -1000,7 +1000,7 @@ TEST_F(NameChangeTransactionTest, sendUpdateCorruptResponse) { ASSERT_TRUE(name_change->selectFwdServer()); // Create a server and start it listening. - FauxServer server(*io_service_, *(name_change->getCurrentServer())); + FauxServer server(io_service_, *(name_change->getCurrentServer())); server.receive(FauxServer::CORRUPT_RESP); // Build a valid request, call sendUpdate and process the response. @@ -1020,7 +1020,7 @@ TEST_F(NameChangeTransactionTest, sendUpdate) { ASSERT_TRUE(name_change->selectFwdServer()); // Create a server and start it listening. - FauxServer server(*io_service_, *(name_change->getCurrentServer())); + FauxServer server(io_service_, *(name_change->getCurrentServer())); server.receive (FauxServer::USE_RCODE, dns::Rcode::NOERROR()); // Build a valid request, call sendUpdate and process the response. @@ -1049,7 +1049,7 @@ TEST_F(NameChangeTransactionTest, tsigUnsignedResponse) { ASSERT_TRUE(name_change->selectFwdServer()); // Create a server and start it listening. - FauxServer server(*io_service_, *(name_change->getCurrentServer())); + FauxServer server(io_service_, *(name_change->getCurrentServer())); server.receive (FauxServer::USE_RCODE, dns::Rcode::NOERROR()); // Do the update. @@ -1080,7 +1080,7 @@ TEST_F(NameChangeTransactionTest, tsigInvalidResponse) { // Create a server, tell it to sign responses with a "random" key, // then start it listening. - FauxServer server(*io_service_, *(name_change->getCurrentServer())); + FauxServer server(io_service_, *(name_change->getCurrentServer())); server.receive (FauxServer::INVALID_TSIG, dns::Rcode::NOERROR()); // Do the update. @@ -1113,7 +1113,7 @@ TEST_F(NameChangeTransactionTest, tsigUnexpectedSignedResponse) { // Create a server, tell it to sign responses with a "random" key, // then start it listening. - FauxServer server(*io_service_, *(name_change->getCurrentServer())); + FauxServer server(io_service_, *(name_change->getCurrentServer())); server.receive (FauxServer::INVALID_TSIG, dns::Rcode::NOERROR()); // Perform an update without TSIG. @@ -1156,7 +1156,7 @@ TEST_F(NameChangeTransactionTest, tsigAllValid) { ASSERT_TRUE(name_change->selectFwdServer()); // Create a server, set its TSIG key, and then start it listening. - FauxServer server(*io_service_, *(name_change->getCurrentServer())); + FauxServer server(io_service_, *(name_change->getCurrentServer())); // Since we create a new server instance each time we need to tell // it not reschedule receives automatically. server.perpetual_receive_ = false; diff --git a/src/lib/d2srv/testutils/nc_test_utils.cc b/src/lib/d2srv/testutils/nc_test_utils.cc index 6791eb9639..56c3988e3b 100644 --- a/src/lib/d2srv/testutils/nc_test_utils.cc +++ b/src/lib/d2srv/testutils/nc_test_utils.cc @@ -47,7 +47,6 @@ const char* valid_d2_config = "{ " " \"port\": 100 } ] } " "] } }"; - const char* TEST_DNS_SERVER_IP = "127.0.0.1"; size_t TEST_DNS_SERVER_PORT = 5301; @@ -56,33 +55,32 @@ const bool NO_RDATA = false; //*************************** FauxServer class *********************** -FauxServer::FauxServer(asiolink::IOService& io_service, +FauxServer::FauxServer(asiolink::IOServicePtr& io_service, asiolink::IOAddress& address, size_t port) - :io_service_(io_service), address_(address), port_(port), - server_socket_(), receive_pending_(false), perpetual_receive_(true), - tsig_key_() { + : io_service_(io_service), address_(address), port_(port), + server_socket_(), receive_pending_(false), perpetual_receive_(true), + tsig_key_() { - server_socket_.reset(new boost::asio::ip::udp::socket(io_service_.getInternalIOService(), - boost::asio::ip::udp::v4())); + server_socket_.reset(new boost::asio::ip::udp::socket(io_service_->getInternalIOService(), + boost::asio::ip::udp::v4())); server_socket_->set_option(boost::asio::socket_base::reuse_address(true)); isc::asiolink::UDPEndpoint endpoint(address_, port_); server_socket_->bind(endpoint.getASIOEndpoint()); } -FauxServer::FauxServer(asiolink::IOService& io_service, +FauxServer::FauxServer(asiolink::IOServicePtr& io_service, DnsServerInfo& server) - :io_service_(io_service), address_(server.getIpAddress()), - port_(server.getPort()), server_socket_(), receive_pending_(false), - perpetual_receive_(true), tsig_key_() { - server_socket_.reset(new boost::asio::ip::udp::socket(io_service_.getInternalIOService(), - boost::asio::ip::udp::v4())); + : io_service_(io_service), address_(server.getIpAddress()), + port_(server.getPort()), server_socket_(), receive_pending_(false), + perpetual_receive_(true), tsig_key_() { + server_socket_.reset(new boost::asio::ip::udp::socket(io_service_->getInternalIOService(), + boost::asio::ip::udp::v4())); server_socket_->set_option(boost::asio::socket_base::reuse_address(true)); isc::asiolink::UDPEndpoint endpoint(address_, port_); server_socket_->bind(endpoint.getASIOEndpoint()); } - FauxServer::~FauxServer() { } @@ -210,13 +208,11 @@ FauxServer::requestHandler(const boost::system::error_code& error, } } - - //********************** TimedIO class *********************** TimedIO::TimedIO() - : io_service_(new isc::asiolink::IOService()), - timer_(*io_service_), run_time_(0) { + : io_service_(new isc::asiolink::IOService()), timer_(io_service_), + run_time_(0) { } TimedIO::~TimedIO() { @@ -371,7 +367,6 @@ TransactionTest::setupForIPv6Transaction(dhcp_ddns::NameChangeType chg_type, setupForIPv6Transaction(chg_type, change_mask, makeTSIGKeyInfo(key_name)); } - //********************** Functions **************************** void diff --git a/src/lib/d2srv/testutils/nc_test_utils.h b/src/lib/d2srv/testutils/nc_test_utils.h index dac4abe844..cd6152cd82 100644 --- a/src/lib/d2srv/testutils/nc_test_utils.h +++ b/src/lib/d2srv/testutils/nc_test_utils.h @@ -42,8 +42,8 @@ public: INVALID_TSIG // Generate a response with the wrong TSIG key }; - /// @brief Reference to IOService to use for IO processing. - asiolink::IOService& io_service_; + /// @brief The IO service used to handle events. + asiolink::IOServicePtr io_service_; /// @brief IP address at which to listen for requests. const asiolink::IOAddress& address_; @@ -77,7 +77,7 @@ public: /// @param io_service IOService to be used for socket IO. /// @param address IP address at which the server should listen. /// @param port Port number at which the server should listen. - FauxServer(asiolink::IOService& io_service, asiolink::IOAddress& address, + FauxServer(asiolink::IOServicePtr& io_service, asiolink::IOAddress& address, size_t port); /// @brief Constructor @@ -85,7 +85,7 @@ public: /// @param io_service IOService to be used for socket IO. /// @param server DnsServerInfo of server the DNS server. This supplies the /// server's ip address and port. - FauxServer(asiolink::IOService& io_service, DnsServerInfo& server); + FauxServer(asiolink::IOServicePtr& io_service, DnsServerInfo& server); /// @brief Destructor virtual ~FauxServer(); diff --git a/src/lib/dhcp_ddns/ncr_io.cc b/src/lib/dhcp_ddns/ncr_io.cc index 8e9e9cf115..1179c74adb 100644 --- a/src/lib/dhcp_ddns/ncr_io.cc +++ b/src/lib/dhcp_ddns/ncr_io.cc @@ -58,7 +58,7 @@ NameChangeListener::NameChangeListener(RequestReceiveHandler& void -NameChangeListener::startListening(isc::asiolink::IOService& io_service) { +NameChangeListener::startListening(const isc::asiolink::IOServicePtr& io_service) { if (amListening()) { // This amounts to a programmatic error. isc_throw(NcrListenerError, "NameChangeListener is already listening"); @@ -160,14 +160,14 @@ NameChangeListener::invokeRecvHandler(const Result result, NameChangeSender::NameChangeSender(RequestSendHandler& send_handler, size_t send_queue_max) : sending_(false), send_handler_(send_handler), - send_queue_max_(send_queue_max), io_service_(NULL), mutex_(new mutex) { + send_queue_max_(send_queue_max), mutex_(new mutex) { // Queue size must be big enough to hold at least 1 entry. setQueueMaxSize(send_queue_max); } void -NameChangeSender::startSending(isc::asiolink::IOService& io_service) { +NameChangeSender::startSending(const isc::asiolink::IOServicePtr& io_service) { if (amSending()) { // This amounts to a programmatic error. isc_throw(NcrSenderError, "NameChangeSender is already sending"); @@ -188,12 +188,12 @@ NameChangeSender::startSending(isc::asiolink::IOService& io_service) { } void -NameChangeSender::startSendingInternal(isc::asiolink::IOService& io_service) { +NameChangeSender::startSendingInternal(const isc::asiolink::IOServicePtr& io_service) { // Clear send marker. ncr_to_send_.reset(); // Remember io service we're given. - io_service_ = &io_service; + io_service_ = io_service; open(io_service); // Set our status to sending. @@ -211,7 +211,7 @@ NameChangeSender::stopSending() { setSending(false); // If there is an outstanding IO to complete, attempt to process it. - if (ioReady() && io_service_ != NULL) { + if (ioReady() && io_service_) { try { runReadyIO(); } catch (const std::exception& ex) { @@ -232,7 +232,7 @@ NameChangeSender::stopSending() { DHCP_DDNS_NCR_SEND_CLOSE_ERROR).arg(ex.what()); } - io_service_ = NULL; + io_service_.reset(); } void diff --git a/src/lib/dhcp_ddns/ncr_io.h b/src/lib/dhcp_ddns/ncr_io.h index 664057d961..54633df625 100644 --- a/src/lib/dhcp_ddns/ncr_io.h +++ b/src/lib/dhcp_ddns/ncr_io.h @@ -110,7 +110,6 @@ public: isc::Exception(file, line, what) { }; }; - /// @brief Abstract interface for receiving NameChangeRequests. /// /// NameChangeListener provides the means to: @@ -222,7 +221,7 @@ public: /// /// @throw NcrListenError if the listener is already "listening" or /// in the event the open or doReceive methods fail. - void startListening(isc::asiolink::IOService& io_service); + void startListening(const isc::asiolink::IOServicePtr& io_service); /// @brief Closes the IO source and stops listen logic. /// @@ -231,6 +230,7 @@ public: void stopListening(); protected: + /// @brief Initiates an asynchronous receive /// /// Sets context information to indicate that IO is in progress and invokes @@ -278,7 +278,7 @@ protected: /// /// @throw If the implementation encounters an error it MUST /// throw it as an isc::Exception or derivative. - virtual void open(isc::asiolink::IOService& io_service) = 0; + virtual void open(const isc::asiolink::IOServicePtr& io_service) = 0; /// @brief Abstract method which closes the IO source. /// @@ -352,7 +352,6 @@ private: /// @brief Defines a smart pointer to an instance of a listener. typedef boost::shared_ptr<NameChangeListener> NameChangeListenerPtr; - /// @brief Thrown when a NameChangeSender encounters an error. class NcrSenderError : public isc::Exception { public: @@ -381,7 +380,6 @@ public: isc::Exception(file, line, what) { }; }; - /// @brief Abstract interface for sending NameChangeRequests. /// /// NameChangeSender provides the means to: @@ -529,7 +527,7 @@ public: /// /// @throw NcrSenderError if the sender is already "sending" or /// NcrSenderOpenError if the open fails. - void startSending(isc::asiolink::IOService & io_service); + void startSending(const isc::asiolink::IOServicePtr& io_service); /// @brief Closes the IO sink and stops send logic. /// @@ -588,7 +586,7 @@ private: /// @brief Prepares the IO for transmission in a thread safe context. /// /// @param io_service is the IOService that will handle IO event processing. - void startSendingInternal(isc::asiolink::IOService & io_service); + void startSendingInternal(const isc::asiolink::IOServicePtr & io_service); /// @brief Queues the given request to be sent in a thread safe context. /// @@ -677,7 +675,7 @@ protected: /// /// @throw If the implementation encounters an error it MUST /// throw it as an isc::Exception or derivative. - virtual void open(isc::asiolink::IOService& io_service) = 0; + virtual void open(const isc::asiolink::IOServicePtr& io_service) = 0; /// @brief Abstract method which closes the IO sink. /// @@ -819,6 +817,16 @@ private: sending_ = value; } +protected: + + /// @brief Pointer to the IOService currently being used by the sender. + /// @note We need to remember the io_service but we receive it by + /// reference. Use a raw pointer to store it. This value should never be + /// exposed and is only valid while in send mode. + asiolink::IOServicePtr io_service_; + +private: + /// @brief Boolean indicator which tracks sending status. bool sending_; @@ -834,12 +842,6 @@ private: /// @brief Pointer to the request which is in the process of being sent. NameChangeRequestPtr ncr_to_send_; - /// @brief Pointer to the IOService currently being used by the sender. - /// @note We need to remember the io_service but we receive it by - /// reference. Use a raw pointer to store it. This value should never be - /// exposed and is only valid while in send mode. - asiolink::IOService* io_service_; - /// @brief The mutex used to protect internal state. const boost::scoped_ptr<std::mutex> mutex_; }; diff --git a/src/lib/dhcp_ddns/ncr_udp.cc b/src/lib/dhcp_ddns/ncr_udp.cc index c46307e657..f32404cb54 100644 --- a/src/lib/dhcp_ddns/ncr_udp.cc +++ b/src/lib/dhcp_ddns/ncr_udp.cc @@ -86,14 +86,16 @@ NameChangeUDPListener::~NameChangeUDPListener() { } void -NameChangeUDPListener::open(isc::asiolink::IOService& io_service) { +NameChangeUDPListener::open(const isc::asiolink::IOServicePtr& io_service) { // create our endpoint and bind the low level socket to it. isc::asiolink::UDPEndpoint endpoint(ip_address_, port_); + io_service_ = io_service; + // Create the low level socket. try { asio_socket_.reset(new boost::asio::ip::udp:: - socket(io_service.getInternalIOService(), + socket(io_service_->getInternalIOService(), (ip_address_.isV4() ? boost::asio::ip::udp::v4() : boost::asio::ip::udp::v6()))); @@ -106,6 +108,7 @@ NameChangeUDPListener::open(isc::asiolink::IOService& io_service) { asio_socket_->bind(endpoint.getASIOEndpoint()); } catch (const boost::system::system_error& ex) { asio_socket_.reset(); + io_service_.reset(); isc_throw (NcrUDPError, ex.code().message()); } @@ -147,6 +150,7 @@ NameChangeUDPListener::close() { } socket_.reset(); + io_service_.reset(); } void @@ -226,14 +230,16 @@ NameChangeUDPSender::~NameChangeUDPSender() { } void -NameChangeUDPSender::open(isc::asiolink::IOService& io_service) { +NameChangeUDPSender::open(const isc::asiolink::IOServicePtr& io_service) { // create our endpoint and bind the low level socket to it. isc::asiolink::UDPEndpoint endpoint(ip_address_, port_); + io_service_ = io_service; + // Create the low level socket. try { asio_socket_.reset(new boost::asio::ip::udp:: - socket(io_service.getInternalIOService(), + socket(io_service_->getInternalIOService(), (ip_address_.isV4() ? boost::asio::ip::udp::v4() : boost::asio::ip::udp::v6()))); @@ -245,6 +251,8 @@ NameChangeUDPSender::open(isc::asiolink::IOService& io_service) { // Bind the low level socket to our endpoint. asio_socket_->bind(endpoint.getASIOEndpoint()); } catch (const boost::system::system_error& ex) { + asio_socket_.reset(); + io_service_.reset(); isc_throw (NcrUDPError, ex.code().message()); } @@ -288,6 +296,7 @@ NameChangeUDPSender::close() { closeWatchSocket(); watch_socket_.reset(); + io_service_.reset(); } void diff --git a/src/lib/dhcp_ddns/ncr_udp.h b/src/lib/dhcp_ddns/ncr_udp.h index 01284aff7e..2b134238ba 100644 --- a/src/lib/dhcp_ddns/ncr_udp.h +++ b/src/lib/dhcp_ddns/ncr_udp.h @@ -110,7 +110,6 @@ #include <boost/shared_array.hpp> - /// responsibility of the completion handler to perform the steps necessary /// to interpret the raw data provided by the service outcome. The /// UDPCallback operator implementation is mostly a pass through. @@ -351,7 +350,7 @@ public: /// @param io_service the IOService which will monitor the socket. /// /// @throw NcrUDPError if the open fails. - virtual void open(isc::asiolink::IOService& io_service); + virtual void open(const isc::asiolink::IOServicePtr& io_service); /// @brief Closes the UDPSocket. /// @@ -397,7 +396,12 @@ public: /// the socket receive completion. void receiveCompletionHandler(const bool successful, const UDPCallback* recv_callback); + private: + + /// @brief The IO service used to handle events. + isc::asiolink::IOServicePtr io_service_; + /// @brief IP address on which to listen for requests. isc::asiolink::IOAddress ip_address_; @@ -431,7 +435,6 @@ private: //@} }; - /// @brief Provides the ability to send NameChangeRequests via UDP socket /// /// This class is a derivation of the NameChangeSender which is capable of @@ -469,7 +472,6 @@ public: /// @brief Destructor virtual ~NameChangeUDPSender(); - /// @brief Opens a UDP socket using the given IOService. /// /// Creates a NameChangeUDPSocket bound to the sender's IP address @@ -478,8 +480,7 @@ public: /// @param io_service the IOService which will monitor the socket. /// /// @throw NcrUDPError if the open fails. - virtual void open(isc::asiolink::IOService& io_service); - + virtual void open(const isc::asiolink::IOServicePtr& io_service); /// @brief Closes the UDPSocket. /// diff --git a/src/lib/dhcp_ddns/tests/ncr_udp_unittests.cc b/src/lib/dhcp_ddns/tests/ncr_udp_unittests.cc index 758689b835..bb48609814 100644 --- a/src/lib/dhcp_ddns/tests/ncr_udp_unittests.cc +++ b/src/lib/dhcp_ddns/tests/ncr_udp_unittests.cc @@ -24,6 +24,7 @@ using namespace std; using namespace isc; +using namespace isc::asiolink; using namespace isc::util; using namespace isc::dhcp_ddns; @@ -88,9 +89,8 @@ public: /// 1. Given valid parameters, the listener constructor works TEST(NameChangeUDPListenerBasicTest, constructionTests) { // Verify the default constructor works. - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); + IOAddress ip_address(TEST_ADDRESS); uint32_t port = LISTENER_PORT; - isc::asiolink::IOService io_service; SimpleListenHandler ncr_handler; // Verify that valid constructor works. EXPECT_NO_THROW(NameChangeUDPListener(ip_address, port, FMT_JSON, @@ -105,9 +105,9 @@ TEST(NameChangeUDPListenerBasicTest, constructionTests) { /// 4. Return to the listening state after stopping TEST(NameChangeUDPListenerBasicTest, basicListenTests) { // Verify the default constructor works. - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); + IOAddress ip_address(TEST_ADDRESS); uint32_t port = LISTENER_PORT; - isc::asiolink::IOService io_service; + IOServicePtr io_service(new IOService()); SimpleListenHandler ncr_handler; NameChangeListenerPtr listener; @@ -134,7 +134,7 @@ TEST(NameChangeUDPListenerBasicTest, basicListenTests) { EXPECT_TRUE(listener->isIoPending()); // Verify that IO pending is false, after cancel event occurs. - EXPECT_NO_THROW(io_service.runOne()); + EXPECT_NO_THROW(io_service->runOne()); EXPECT_FALSE(listener->isIoPending()); // Verify that attempting to stop listening when we are not is ok. @@ -148,29 +148,28 @@ TEST(NameChangeUDPListenerBasicTest, basicListenTests) { /// @brief Compares two NameChangeRequests for equality. bool checkSendVsReceived(NameChangeRequestPtr sent_ncr, NameChangeRequestPtr received_ncr) { - return ((sent_ncr && received_ncr) && - (*sent_ncr == *received_ncr)); + return ((sent_ncr && received_ncr) && (*sent_ncr == *received_ncr)); } /// @brief Text fixture for testing NameChangeUDPListener class NameChangeUDPListenerTest : public virtual ::testing::Test, NameChangeListener::RequestReceiveHandler { public: - isc::asiolink::IOService io_service_; + IOServicePtr io_service_; NameChangeListener::Result result_; NameChangeRequestPtr sent_ncr_; NameChangeRequestPtr received_ncr_; NameChangeListenerPtr listener_; - isc::asiolink::IntervalTimer test_timer_; + IntervalTimer test_timer_; /// @brief Constructor // // Instantiates the listener member and the test timer. The timer is used // to ensure a test doesn't go awry and hang forever. NameChangeUDPListenerTest() - : io_service_(), result_(NameChangeListener::SUCCESS), + : io_service_(new IOService()), result_(NameChangeListener::SUCCESS), test_timer_(io_service_) { - isc::asiolink::IOAddress addr(TEST_ADDRESS); + IOAddress addr(TEST_ADDRESS); listener_.reset(new NameChangeUDPListener(addr, LISTENER_PORT, FMT_JSON, *this, true)); @@ -197,7 +196,7 @@ public: // Create a UDP socket through which our "sender" will send the NCR. boost::asio::ip::udp::socket - udp_socket(io_service_.getInternalIOService(), boost::asio::ip::udp::v4()); + udp_socket(io_service_->getInternalIOService(), boost::asio::ip::udp::v4()); // Create an endpoint pointed at the listener. boost::asio::ip::udp::endpoint @@ -228,7 +227,7 @@ public: /// /// This callback stops all running (hanging) tasks on IO service. void testTimeoutHandler() { - io_service_.stop(); + io_service_->stop(); FAIL() << "Test timeout hit."; } }; @@ -252,7 +251,7 @@ TEST_F(NameChangeUDPListenerTest, basicReceiveTests) { ASSERT_NO_THROW(sendNcr(valid_msgs[i])); // Execute no more then one event, which should be receive complete. - EXPECT_NO_THROW(io_service_.runOne()); + EXPECT_NO_THROW(io_service_->runOne()); // Verify the "application" status value for a successful complete. EXPECT_EQ(NameChangeListener::SUCCESS, result_); @@ -268,7 +267,7 @@ TEST_F(NameChangeUDPListenerTest, basicReceiveTests) { EXPECT_FALSE(listener_->amListening()); // Verify that IO pending is false, after cancel event occurs. - EXPECT_NO_THROW(io_service_.runOne()); + EXPECT_NO_THROW(io_service_->runOne()); EXPECT_FALSE(listener_->isIoPending()); } @@ -312,9 +311,8 @@ public: /// 3. Default construction provides default max queue size /// 4. Construction with a custom max queue size works TEST_F(NameChangeUDPSenderBasicTest, constructionTests) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); + IOAddress ip_address(TEST_ADDRESS); uint32_t port = SENDER_PORT; - isc::asiolink::IOService io_service; SimpleSendHandler ncr_handler; // Verify that constructing with an queue size of zero is not allowed. @@ -349,9 +347,8 @@ TEST_F(NameChangeUDPSenderBasicTest, constructionTestsMultiThreading) { // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); + IOAddress ip_address(TEST_ADDRESS); uint32_t port = SENDER_PORT; - isc::asiolink::IOService io_service; SimpleSendHandler ncr_handler; // Verify that constructing with an queue size of zero is not allowed. @@ -378,8 +375,8 @@ TEST_F(NameChangeUDPSenderBasicTest, constructionTestsMultiThreading) { /// @brief Tests NameChangeUDPSender basic send functionality TEST_F(NameChangeUDPSenderBasicTest, basicSendTests) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Tests are based on a list of messages, get the count now. @@ -506,8 +503,8 @@ TEST_F(NameChangeUDPSenderBasicTest, basicSendTestsMultiThreading) { // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Tests are based on a list of messages, get the count now. @@ -632,8 +629,8 @@ TEST_F(NameChangeUDPSenderBasicTest, basicSendTestsMultiThreading) { /// @brief Tests that sending gets kick-started if the queue isn't empty /// when startSending is called. TEST_F(NameChangeUDPSenderBasicTest, autoStart) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Tests are based on a list of messages, get the count now. @@ -687,8 +684,8 @@ TEST_F(NameChangeUDPSenderBasicTest, autoStartMultiThreading) { // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Tests are based on a list of messages, get the count now. @@ -738,9 +735,9 @@ TEST_F(NameChangeUDPSenderBasicTest, autoStartMultiThreading) { /// @brief Tests NameChangeUDPSender basic send with INADDR_ANY and port 0. TEST_F(NameChangeUDPSenderBasicTest, anyAddressSend) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOAddress any_address("0.0.0.0"); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOAddress any_address("0.0.0.0"); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Tests are based on a list of messages, get the count now. @@ -776,9 +773,9 @@ TEST_F(NameChangeUDPSenderBasicTest, anyAddressSendMultiThreading) { // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOAddress any_address("0.0.0.0"); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOAddress any_address("0.0.0.0"); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Tests are based on a list of messages, get the count now. @@ -811,9 +808,9 @@ TEST_F(NameChangeUDPSenderBasicTest, anyAddressSendMultiThreading) { /// @brief Test the NameChangeSender::assumeQueue method. TEST_F(NameChangeUDPSenderBasicTest, assumeQueue) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); + IOAddress ip_address(TEST_ADDRESS); uint32_t port = SENDER_PORT; - isc::asiolink::IOService io_service; + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; NameChangeRequestPtr ncr; @@ -883,9 +880,9 @@ TEST_F(NameChangeUDPSenderBasicTest, assumeQueueMultiThreading) { // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); + IOAddress ip_address(TEST_ADDRESS); uint32_t port = SENDER_PORT; - isc::asiolink::IOService io_service; + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; NameChangeRequestPtr ncr; @@ -957,20 +954,20 @@ class NameChangeUDPTest : public virtual ::testing::Test, NameChangeListener::RequestReceiveHandler, NameChangeSender::RequestSendHandler { public: - isc::asiolink::IOService io_service_; + IOServicePtr io_service_; NameChangeListener::Result recv_result_; NameChangeSender::Result send_result_; NameChangeListenerPtr listener_; NameChangeSenderPtr sender_; - isc::asiolink::IntervalTimer test_timer_; + IntervalTimer test_timer_; std::vector<NameChangeRequestPtr> sent_ncrs_; std::vector<NameChangeRequestPtr> received_ncrs_; NameChangeUDPTest() - : io_service_(), recv_result_(NameChangeListener::SUCCESS), + : io_service_(new IOService()), recv_result_(NameChangeListener::SUCCESS), send_result_(NameChangeSender::SUCCESS), test_timer_(io_service_) { - isc::asiolink::IOAddress addr(TEST_ADDRESS); + IOAddress addr(TEST_ADDRESS); // Create our listener instance. Note that reuse_address is true. listener_.reset( new NameChangeUDPListener(addr, LISTENER_PORT, FMT_JSON, @@ -1019,7 +1016,7 @@ public: /// /// This callback stops all running (hanging) tasks on IO service. void testTimeoutHandler() { - io_service_.stop(); + io_service_->stop(); FAIL() << "Test timeout hit."; } @@ -1098,7 +1095,7 @@ TEST_F(NameChangeUDPTest, roundTripTest) { // Execute callbacks until we have sent and received all of messages. while (sender_->getQueueSize() > 0 || (received_ncrs_.size() < num_msgs)) { - EXPECT_NO_THROW(io_service_.runOne()); + EXPECT_NO_THROW(io_service_->runOne()); } // Send queue should be empty. @@ -1116,7 +1113,7 @@ TEST_F(NameChangeUDPTest, roundTripTest) { EXPECT_FALSE(listener_->amListening()); // Verify that IO pending is false, after cancel event occurs. - EXPECT_NO_THROW(io_service_.runOne()); + EXPECT_NO_THROW(io_service_->runOne()); EXPECT_FALSE(listener_->isIoPending()); // Verify that we can gracefully stop sending. @@ -1152,7 +1149,7 @@ TEST_F(NameChangeUDPTest, roundTripTestMultiThreading) { // Execute callbacks until we have sent and received all of messages. while (sender_->getQueueSize() > 0 || (received_ncrs_.size() < num_msgs)) { - EXPECT_NO_THROW(io_service_.runOne()); + EXPECT_NO_THROW(io_service_->runOne()); } // Send queue should be empty. @@ -1171,7 +1168,7 @@ TEST_F(NameChangeUDPTest, roundTripTestMultiThreading) { EXPECT_FALSE(listener_->amListening()); // Verify that IO pending is false, after cancel event occurs. - EXPECT_NO_THROW(io_service_.runOne()); + EXPECT_NO_THROW(io_service_->runOne()); EXPECT_FALSE(listener_->isIoPending()); // Verify that we can gracefully stop sending. @@ -1182,8 +1179,8 @@ TEST_F(NameChangeUDPTest, roundTripTestMultiThreading) { // Tests error handling of a failure to mark the watch socket ready, when // sendRequest() is called. TEST_F(NameChangeUDPSenderBasicTest, watchClosedBeforeSendRequest) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Create the sender and put into send mode. @@ -1217,8 +1214,8 @@ TEST_F(NameChangeUDPSenderBasicTest, watchClosedBeforeSendRequestMultiThreading) // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Create the sender and put into send mode. @@ -1249,8 +1246,8 @@ TEST_F(NameChangeUDPSenderBasicTest, watchClosedBeforeSendRequestMultiThreading) // Tests error handling of a failure to mark the watch socket ready, when // sendNext() is called during completion handling. TEST_F(NameChangeUDPSenderBasicTest, watchClosedAfterSendRequest) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Create the sender and put into send mode. @@ -1291,8 +1288,8 @@ TEST_F(NameChangeUDPSenderBasicTest, watchClosedAfterSendRequestMultiThreading) // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Create the sender and put into send mode. @@ -1331,8 +1328,8 @@ TEST_F(NameChangeUDPSenderBasicTest, watchClosedAfterSendRequestMultiThreading) // Tests error handling of a failure to clear the watch socket during // completion handling. TEST_F(NameChangeUDPSenderBasicTest, watchSocketBadRead) { - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Create the sender and put into send mode. @@ -1382,8 +1379,8 @@ TEST_F(NameChangeUDPSenderBasicTest, watchSocketBadReadMultiThreading) { // Enable multi-threading MultiThreadingMgr::instance().setMode(true); - isc::asiolink::IOAddress ip_address(TEST_ADDRESS); - isc::asiolink::IOService io_service; + IOAddress ip_address(TEST_ADDRESS); + IOServicePtr io_service(new IOService()); SimpleSendHandler ncr_handler; // Create the sender and put into send mode. diff --git a/src/lib/dhcpsrv/d2_client_mgr.cc b/src/lib/dhcpsrv/d2_client_mgr.cc index 807f728d40..cb66a44446 100644 --- a/src/lib/dhcpsrv/d2_client_mgr.cc +++ b/src/lib/dhcpsrv/d2_client_mgr.cc @@ -259,14 +259,14 @@ D2ClientMgr::startSender(D2ClientErrorHandler error_handler) { // Create a our own service instance when we are not being multiplexed // into an external service.. private_io_service_.reset(new asiolink::IOService()); - startSender(error_handler, *private_io_service_); + startSender(error_handler, private_io_service_); LOG_INFO(dhcpsrv_logger, DHCPSRV_DHCP_DDNS_SENDER_STARTED) .arg(d2_client_config_->toText()); } void D2ClientMgr::startSender(D2ClientErrorHandler error_handler, - isc::asiolink::IOService& io_service) { + const isc::asiolink::IOServicePtr& io_service) { if (amSending()) { return; } diff --git a/src/lib/dhcpsrv/d2_client_mgr.h b/src/lib/dhcpsrv/d2_client_mgr.h index 65c034e235..356f47768b 100644 --- a/src/lib/dhcpsrv/d2_client_mgr.h +++ b/src/lib/dhcpsrv/d2_client_mgr.h @@ -287,7 +287,7 @@ public: /// @throw D2ClientError if sender instance is null. Underlying layer /// may throw NCRSenderExceptions exceptions. void startSender(D2ClientErrorHandler error_handler, - isc::asiolink::IOService& io_service); + const isc::asiolink::IOServicePtr& io_service); /// @brief Enables sending NameChangeRequests to kea-dhcp-ddns /// diff --git a/src/lib/dhcpsrv/tests/cfg_expiration_unittest.cc b/src/lib/dhcpsrv/tests/cfg_expiration_unittest.cc index ee5b3a76d8..067a697809 100644 --- a/src/lib/dhcpsrv/tests/cfg_expiration_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_expiration_unittest.cc @@ -322,7 +322,7 @@ public: /// /// @param timeout_ms Amount of time after which the method returns. void runTimersWithTimeout(const long timeout_ms) { - IntervalTimer timer(*io_service_); + IntervalTimer timer(io_service_); timer.setup([this]() { io_service_->stop(); }, timeout_ms, IntervalTimer::ONE_SHOT); diff --git a/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc b/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc index 5b10f964e3..b02d7841f4 100644 --- a/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc @@ -117,7 +117,7 @@ CfgIfaceTest::unicastOpen(const std::string& iface_name) const { void CfgIfaceTest::doWait(const long timeout) { - asiolink::IntervalTimer timer(*io_service_); + asiolink::IntervalTimer timer(io_service_); timer.setup([this]() { io_service_->stop(); }, timeout, asiolink::IntervalTimer::ONE_SHOT); diff --git a/src/lib/dhcpsrv/tests/d2_udp_unittest.cc b/src/lib/dhcpsrv/tests/d2_udp_unittest.cc index 106e7bc4d3..777f070ad8 100644 --- a/src/lib/dhcpsrv/tests/d2_udp_unittest.cc +++ b/src/lib/dhcpsrv/tests/d2_udp_unittest.cc @@ -21,6 +21,7 @@ #include <sys/select.h> using namespace std; +using namespace isc::asiolink; using namespace isc::dhcp; using namespace isc; namespace ph = std::placeholders; @@ -65,10 +66,9 @@ public: // Update the configuration with one that is enabled. D2ClientConfigPtr new_cfg; - isc::asiolink::IOAddress server_ip(server_address); - isc::asiolink::IOAddress sender_ip(server_ip.isV4() ? - D2ClientConfig::DFT_V4_SENDER_IP : - D2ClientConfig::DFT_V6_SENDER_IP); + IOAddress server_ip(server_address); + IOAddress sender_ip(server_ip.isV4() ? D2ClientConfig::DFT_V4_SENDER_IP : + D2ClientConfig::DFT_V6_SENDER_IP); ASSERT_NO_THROW(new_cfg.reset(new D2ClientConfig(true, server_ip, server_port, @@ -296,7 +296,7 @@ TEST_F(D2ClientMgrTest, udpSendExternalIOService) { enableDdns("127.0.0.1", 53001, dhcp_ddns::NCR_UDP); // Place sender in send mode using an external IO service. - asiolink::IOService io_service; + asiolink::IOServicePtr io_service(new IOService()); ASSERT_NO_THROW(startSender(getErrorHandler(), io_service)); // select_fd should evaluate to NOT ready to read. @@ -328,7 +328,7 @@ TEST_F(D2ClientMgrTest, udpSendExternalIOService6) { enableDdns("::1", 53001, dhcp_ddns::NCR_UDP); // Place sender in send mode using an external IO service. - asiolink::IOService io_service; + asiolink::IOServicePtr io_service(new IOService()); ASSERT_NO_THROW(startSender(getErrorHandler(), io_service)); // select_fd should evaluate to NOT ready to read. diff --git a/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc index e9e7a2b72d..bca014b60e 100644 --- a/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc @@ -242,7 +242,7 @@ public: /// /// @param ms Duration in milliseconds. void setTestTime(const uint32_t ms) { - IntervalTimer timer(*io_service_); + IntervalTimer timer(io_service_); timer.setup([this]() { io_service_->stop(); }, ms, IntervalTimer::ONE_SHOT); @@ -260,8 +260,8 @@ public: bool waitForProcess(const Memfile_LeaseMgr& lease_mgr, const uint8_t timeout) { const uint32_t iterations_max = timeout * 1000; - IntervalTimer fast_path_timer(*io_service_); - IntervalTimer timer(*io_service_); + IntervalTimer fast_path_timer(io_service_); + IntervalTimer timer(io_service_); bool elapsed = false; timer.setup([&]() { io_service_->stop(); diff --git a/src/lib/dhcpsrv/tests/timer_mgr_unittest.cc b/src/lib/dhcpsrv/tests/timer_mgr_unittest.cc index 9dd1845d33..e76474a54d 100644 --- a/src/lib/dhcpsrv/tests/timer_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/timer_mgr_unittest.cc @@ -165,7 +165,7 @@ TimerMgrTest::registerTimer(const std::string& timer_name, const long timer_inte void TimerMgrTest::doWait(const long timeout, const bool /*call_receive*/) { - IntervalTimer timer(*io_service_); + IntervalTimer timer(io_service_); timer.setup([this]() { io_service_->stop(); }, timeout, IntervalTimer::ONE_SHOT); diff --git a/src/lib/dhcpsrv/timer_mgr.cc b/src/lib/dhcpsrv/timer_mgr.cc index a8d970a2ad..3fa1fd6560 100644 --- a/src/lib/dhcpsrv/timer_mgr.cc +++ b/src/lib/dhcpsrv/timer_mgr.cc @@ -58,7 +58,7 @@ struct TimerInfo { /// during the timer registration. /// @param interval Timer interval in milliseconds. /// @param mode Interval timer scheduling mode. - TimerInfo(asiolink::IOService& io_service, + TimerInfo(const asiolink::IOServicePtr& io_service, const asiolink::IntervalTimer::Callback& user_callback, const long interval, const asiolink::IntervalTimer::Mode& mode) @@ -274,7 +274,7 @@ TimerMgrImpl::registerTimerInternal(const std::string& timer_name, // Create a structure holding the configuration for the timer. It will // create the instance if the IntervalTimer. It will also hold the // callback, interval and scheduling mode parameters. - TimerInfoPtr timer_info(new TimerInfo(*io_service_, callback, + TimerInfoPtr timer_info(new TimerInfo(io_service_, callback, interval, scheduling_mode)); // Actually register the timer. diff --git a/src/lib/http/client.cc b/src/lib/http/client.cc index 1f139a3cd9..66ab6490e0 100644 --- a/src/lib/http/client.cc +++ b/src/lib/http/client.cc @@ -118,7 +118,7 @@ public: /// @param conn_pool Back pointer to the connection pool to which this /// connection belongs. /// @param url URL associated with this connection. - explicit Connection(IOService& io_service, + explicit Connection(const IOServicePtr& io_service, const TlsContextPtr& tls_context, const ConnectionPoolPtr& conn_pool, const Url& url); @@ -482,7 +482,7 @@ public: /// connections. /// @param max_url_connections maximum number of concurrent /// connections allowed per URL. - explicit ConnectionPool(IOService& io_service, size_t max_url_connections) + explicit ConnectionPool(const IOServicePtr& io_service, size_t max_url_connections) : io_service_(io_service), destinations_(), pool_mutex_(), max_url_connections_(max_url_connections) { } @@ -515,8 +515,8 @@ public: /// should be processed. void postProcessNextRequest(const Url& url, const TlsContextPtr& tls_context) { - io_service_.post(std::bind(&ConnectionPool::processNextRequest, - shared_from_this(), url, tls_context)); + io_service_->post(std::bind(&ConnectionPool::processNextRequest, + shared_from_this(), url, tls_context)); } /// @brief Queue next request for sending to the server. @@ -1106,7 +1106,7 @@ private: } /// @brief A reference to the IOService that drives socket IO. - IOService& io_service_; + IOServicePtr io_service_; /// @brief Map of Destinations by URL and TLS context. std::map<DestinationDescriptor, DestinationPtr> destinations_; @@ -1118,7 +1118,7 @@ private: size_t max_url_connections_; }; -Connection::Connection(IOService& io_service, +Connection::Connection(const IOServicePtr& io_service, const TlsContextPtr& tls_context, const ConnectionPoolPtr& conn_pool, const Url& url) @@ -1783,7 +1783,7 @@ public: /// the thread pool threads will be created and started, with the /// operational state being RUNNING. Applicable only when thread-pool size /// is greater than zero. - HttpClientImpl(IOService& io_service, size_t thread_pool_size = 0, + HttpClientImpl(const IOServicePtr& io_service, size_t thread_pool_size = 0, bool defer_thread_start = false) : thread_pool_size_(thread_pool_size), thread_pool_() { if (thread_pool_size_ > 0) { @@ -1792,7 +1792,7 @@ public: // Create the connection pool. Note that we use the thread_pool_size // as the maximum connections per URL value. - conn_pool_.reset(new ConnectionPool(*thread_io_service_, thread_pool_size_)); + conn_pool_.reset(new ConnectionPool(thread_io_service_, thread_pool_size_)); // Create the thread pool. thread_pool_.reset(new IoServiceThreadPool(thread_io_service_, thread_pool_size_, @@ -1947,7 +1947,7 @@ private: IoServiceThreadPoolPtr thread_pool_; }; -HttpClient::HttpClient(IOService& io_service, bool multi_threading_enabled, +HttpClient::HttpClient(const IOServicePtr& io_service, bool multi_threading_enabled, size_t thread_pool_size, bool defer_thread_start) { if (!multi_threading_enabled && thread_pool_size) { isc_throw(InvalidOperation, diff --git a/src/lib/http/client.h b/src/lib/http/client.h index bea90576b7..7215d44520 100644 --- a/src/lib/http/client.h +++ b/src/lib/http/client.h @@ -145,7 +145,7 @@ public: /// the thread pool threads will be created and started, with the /// operational state being RUNNING. Applicable only when thread-pool size /// is greater than zero. - explicit HttpClient(asiolink::IOService& io_service, + explicit HttpClient(const asiolink::IOServicePtr& io_service, bool multi_threading_enabled, size_t thread_pool_size = 0, bool defer_thread_start = false); diff --git a/src/lib/http/connection.cc b/src/lib/http/connection.cc index b1e57bddbe..880d87df0c 100644 --- a/src/lib/http/connection.cc +++ b/src/lib/http/connection.cc @@ -62,7 +62,7 @@ SocketCallback::operator()(boost::system::error_code ec, size_t length) { callback_(ec, length); } -HttpConnection::HttpConnection(asiolink::IOService& io_service, +HttpConnection::HttpConnection(const asiolink::IOServicePtr& io_service, const HttpAcceptorPtr& acceptor, const TlsContextPtr& tls_context, HttpConnectionPool& connection_pool, diff --git a/src/lib/http/connection.h b/src/lib/http/connection.h index 70109de660..4597ca4b48 100644 --- a/src/lib/http/connection.h +++ b/src/lib/http/connection.h @@ -241,7 +241,7 @@ public: /// @param request_timeout Configured timeout for a HTTP request. /// @param idle_timeout Timeout after which persistent HTTP connection is /// closed by the server. - HttpConnection(asiolink::IOService& io_service, + HttpConnection(const asiolink::IOServicePtr& io_service, const HttpAcceptorPtr& acceptor, const asiolink::TlsContextPtr& tls_context, HttpConnectionPool& connection_pool, diff --git a/src/lib/http/listener.cc b/src/lib/http/listener.cc index 2e6d2e1c62..14103de588 100644 --- a/src/lib/http/listener.cc +++ b/src/lib/http/listener.cc @@ -15,7 +15,7 @@ using namespace isc::asiolink; namespace isc { namespace http { -HttpListener::HttpListener(IOService& io_service, +HttpListener::HttpListener(const IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, diff --git a/src/lib/http/listener.h b/src/lib/http/listener.h index 8965f29f1c..b6f49f4c97 100644 --- a/src/lib/http/listener.h +++ b/src/lib/http/listener.h @@ -96,7 +96,7 @@ public: /// /// @throw HttpListenerError when any of the specified parameters is /// invalid. - HttpListener(asiolink::IOService& io_service, + HttpListener(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const asiolink::TlsContextPtr& tls_context, diff --git a/src/lib/http/listener_impl.cc b/src/lib/http/listener_impl.cc index fdcbdd0c8b..80db799405 100644 --- a/src/lib/http/listener_impl.cc +++ b/src/lib/http/listener_impl.cc @@ -16,7 +16,7 @@ namespace ph = std::placeholders; namespace isc { namespace http { -HttpListenerImpl::HttpListenerImpl(IOService& io_service, +HttpListenerImpl::HttpListenerImpl(const IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, diff --git a/src/lib/http/listener_impl.h b/src/lib/http/listener_impl.h index 4ad1960844..0ac3de7c14 100644 --- a/src/lib/http/listener_impl.h +++ b/src/lib/http/listener_impl.h @@ -44,7 +44,7 @@ public: /// /// @throw HttpListenerError when any of the specified parameters is /// invalid. - HttpListenerImpl(asiolink::IOService& io_service, + HttpListenerImpl(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const asiolink::TlsContextPtr& tls_context, @@ -102,8 +102,8 @@ protected: virtual HttpConnectionPtr createConnection(const HttpResponseCreatorPtr& response_creator, const HttpAcceptorCallback& callback); - /// @brief Reference to the IO service. - asiolink::IOService& io_service_; + /// @brief Pointer to the IO service. + asiolink::IOServicePtr io_service_; /// @brief TLS context. asiolink::TlsContextPtr tls_context_; diff --git a/src/lib/http/tests/client_mt_unittests.cc b/src/lib/http/tests/client_mt_unittests.cc index b68c88572b..bb39f68e14 100644 --- a/src/lib/http/tests/client_mt_unittests.cc +++ b/src/lib/http/tests/client_mt_unittests.cc @@ -196,7 +196,7 @@ public: /// @brief Constructor. MultiThreadingHttpClientTest() - : io_service_(), client_(), listener_(), factory_(), listeners_(), factories_(), + : io_service_(new IOService()), client_(), listener_(), factory_(), listeners_(), factories_(), test_timer_(io_service_), num_threads_(0), num_batches_(0), num_listeners_(0), expected_requests_(0), num_in_progress_(0), num_finished_(0), paused_(false), pause_cnt_(0) { @@ -229,7 +229,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Runs the test's IOService until the desired number of requests @@ -237,10 +237,10 @@ public: void runIOService(size_t request_limit) { while (getRRCount() < request_limit) { // Always call reset() before we call run(); - io_service_.restart(); + io_service_->restart(); // Run until a client stops the service. - io_service_.run(); + io_service_->run(); } } @@ -354,7 +354,7 @@ public: num_in_progress_ = 0; test_cv_.notify_all(); // Stop the test's IOService. - io_service_.stop(); + io_service_->stop(); } else { // I'm done but others aren't wait here. bool ret = test_cv_.wait_for(lck, std::chrono::seconds(10), @@ -410,8 +410,8 @@ public: std::unique_lock<std::mutex> lck(test_mutex_); clientRRs_.push_back(clientRR); ++num_finished_; - if ((num_finished_ >= expected_requests_) && !io_service_.stopped()) { - io_service_.stop(); + if ((num_finished_ >= expected_requests_) && !io_service_->stopped()) { + io_service_->stop(); } } @@ -773,7 +773,7 @@ public: } /// @brief IO service used in the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Instance of the client used in the tests. HttpClientPtr client_; diff --git a/src/lib/http/tests/connection_pool_unittests.cc b/src/lib/http/tests/connection_pool_unittests.cc index b8337c3d36..d6267a0e14 100644 --- a/src/lib/http/tests/connection_pool_unittests.cc +++ b/src/lib/http/tests/connection_pool_unittests.cc @@ -105,7 +105,7 @@ public: /// @brief Constructor. HttpConnectionPoolTest() - : io_service_(), + : io_service_(new IOService()), acceptor_(new HttpAcceptor(io_service_)), connection_pool_(), response_creator_(new TestHttpResponseCreator()) { @@ -216,7 +216,7 @@ public: ASSERT_EQ(1, pool.hasConnection(conn1)); } - IOService io_service_; ///< IO service. + IOServicePtr io_service_; ///< IO service. HttpAcceptorPtr acceptor_; ///< Test acceptor. HttpConnectionPool connection_pool_; ///< Test connection pool. HttpResponseCreatorPtr response_creator_; ///< Test response creator. diff --git a/src/lib/http/tests/server_client_unittests.cc b/src/lib/http/tests/server_client_unittests.cc index 47a23625db..6572e8381a 100644 --- a/src/lib/http/tests/server_client_unittests.cc +++ b/src/lib/http/tests/server_client_unittests.cc @@ -208,7 +208,7 @@ template<typename HttpConnectionType> class HttpListenerImplCustom : public HttpListenerImpl { public: - HttpListenerImplCustom(IOService& io_service, + HttpListenerImplCustom(const IOServicePtr& io_service, const IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, @@ -270,7 +270,7 @@ public: /// /// @throw HttpListenerError when any of the specified parameters is /// invalid. - HttpListenerCustom(IOService& io_service, + HttpListenerCustom(const IOServicePtr& io_service, const IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, @@ -308,7 +308,7 @@ public: /// @param request_timeout Configured timeout for a HTTP request. /// @param idle_timeout Timeout after which persistent HTTP connection is /// closed by the server. - HttpConnectionLongWriteBuffer(IOService& io_service, + HttpConnectionLongWriteBuffer(const IOServicePtr& io_service, const HttpAcceptorPtr& acceptor, const TlsContextPtr& tls_context, HttpConnectionPool& connection_pool, @@ -355,7 +355,7 @@ public: /// @param request_timeout Configured timeout for a HTTP request. /// @param idle_timeout Timeout after which persistent HTTP connection is /// closed by the server. - HttpConnectionTransactionChange(IOService& io_service, + HttpConnectionTransactionChange(const IOServicePtr& io_service, const HttpAcceptorPtr& acceptor, const TlsContextPtr& tls_context, HttpConnectionPool& connection_pool, @@ -399,7 +399,7 @@ public: /// /// Starts test timer which detects timeouts. HttpListenerTest() - : io_service_(), factory_(new TestHttpResponseCreatorFactory()), + : io_service_(new IOService()), factory_(new TestHttpResponseCreatorFactory()), test_timer_(io_service_), run_io_service_timer_(io_service_), clients_() { test_timer_.setup(std::bind(&HttpListenerTest::timeoutHandler, this, true), TEST_TIMEOUT, IntervalTimer::ONE_SHOT); @@ -435,7 +435,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Runs IO service with optional timeout. @@ -443,16 +443,16 @@ public: /// @param timeout Optional value specifying for how long the io service /// should be ran. void runIOService(long timeout = 0) { - io_service_.restart(); + io_service_->restart(); if (timeout > 0) { run_io_service_timer_.setup(std::bind(&HttpListenerTest::timeoutHandler, this, false), timeout, IntervalTimer::ONE_SHOT); } - io_service_.run(); - io_service_.restart(); - io_service_.poll(); + io_service_->run(); + io_service_->restart(); + io_service_->poll(); } /// @brief Returns HTTP OK response expected by unit tests. @@ -554,7 +554,7 @@ public: } /// @brief IO service used in the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Pointer to the response creator factory. HttpResponseCreatorFactoryPtr factory_; @@ -593,7 +593,7 @@ TEST_F(HttpListenerTest, listen) { EXPECT_EQ(httpOk(HttpVersion::HTTP_11()), client->getResponse()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } @@ -645,7 +645,7 @@ TEST_F(HttpListenerTest, keepAlive) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that persistent HTTP connection is established by default @@ -694,7 +694,7 @@ TEST_F(HttpListenerTest, persistentConnection) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that "keep-alive" connection is closed by the server after @@ -753,7 +753,7 @@ TEST_F(HttpListenerTest, keepAliveTimeout) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that persistent connection is closed by the server after @@ -810,7 +810,7 @@ TEST_F(HttpListenerTest, persistentConnectionTimeout) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that HTTP/1.1 connection remains open even if there is an @@ -863,7 +863,7 @@ TEST_F(HttpListenerTest, persistentConnectionBadBody) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that the HTTP listener can't be started twice. @@ -938,7 +938,7 @@ TEST_F(HttpListenerTest, invalidIdleTimeout) { // This test verifies that listener can't be bound to the port to which // other server is bound. TEST_F(HttpListenerTest, addressInUse) { - tcp::acceptor acceptor(io_service_.getInternalIOService()); + tcp::acceptor acceptor(io_service_->getInternalIOService()); // Use other port than SERVER_PORT to make sure that this TCP connection // doesn't affect subsequent tests. tcp::endpoint endpoint(address::from_string(SERVER_ADDRESS), @@ -1021,7 +1021,7 @@ public: listener_.stop(); listener2_.stop(); listener3_.stop(); - io_service_.poll(); + io_service_->poll(); MultiThreadingMgr::instance().setMode(false); } @@ -1076,7 +1076,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_FALSE(ec); })); @@ -1090,7 +1090,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_FALSE(ec); })); @@ -1137,7 +1137,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_FALSE(ec); })); @@ -1151,7 +1151,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_FALSE(ec); })); @@ -1193,7 +1193,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -1209,7 +1209,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -1250,7 +1250,7 @@ public: request1, response1, [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); EXPECT_FALSE(ec); })); @@ -1273,7 +1273,7 @@ public: request2, response2, [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); EXPECT_FALSE(ec); })); @@ -1306,7 +1306,7 @@ public: [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); // The server should have returned an IO error. EXPECT_TRUE(ec); })); @@ -1339,7 +1339,7 @@ public: [this](const boost::system::error_code& ec, const HttpResponsePtr& response, const std::string& parsing_error) { - io_service_.stop(); + io_service_->stop(); // There should be no IO error (answer from the server is received). EXPECT_FALSE(ec); // The response object is NULL because it couldn't be finalized. @@ -1380,7 +1380,7 @@ public: const HttpResponsePtr& response, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } // In this particular case we know exactly the type of the // IO error returned, because the client explicitly sets this @@ -1408,7 +1408,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } })); @@ -1439,7 +1439,7 @@ public: const HttpResponsePtr& response, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } // In this particular case we know exactly the type of the // IO error returned, because the client explicitly sets this @@ -1466,7 +1466,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } })); @@ -1560,7 +1560,7 @@ public: [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); // Everything should be ok. EXPECT_TRUE(ec.value() == 0); @@ -1596,7 +1596,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_FALSE(ec); @@ -1616,7 +1616,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_FALSE(ec); }, @@ -1691,7 +1691,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num == 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_EQ(1, monitor.connect_cnt_); // We should have 1 connect. @@ -1751,7 +1751,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num == 1) { - io_service_.stop(); + io_service_->stop(); } EXPECT_EQ(2, monitor.connect_cnt_); // We should have 1 connect. diff --git a/src/lib/http/tests/test_http_client.h b/src/lib/http/tests/test_http_client.h index 3b164756f1..55568a9ad9 100644 --- a/src/lib/http/tests/test_http_client.h +++ b/src/lib/http/tests/test_http_client.h @@ -31,10 +31,10 @@ public: /// @param io_service IO service to be stopped on error or completion. /// @param server_address string containing the IP address of the server. /// @param port port number of the server. - explicit TestHttpClient(IOService& io_service, + explicit TestHttpClient(const IOServicePtr& io_service, const std::string& server_address = "127.0.0.1", uint16_t port = 18123) - : io_service_(io_service.getInternalIOService()), socket_(io_service_), + : io_service_(io_service), socket_(io_service_->getInternalIOService()), buf_(), response_(), server_address_(server_address), server_port_(port), receive_done_(false) { } @@ -65,7 +65,7 @@ public: if (ec.value() != boost::asio::error::in_progress) { ADD_FAILURE() << "error occurred while connecting: " << ec.message(); - io_service_.stop(); + io_service_->stop(); return; } } @@ -100,7 +100,7 @@ public: } else { ADD_FAILURE() << "error occurred while connecting: " << ec.message(); - io_service_.stop(); + io_service_->stop(); return; } } @@ -143,7 +143,7 @@ public: // Error occurred, bail... ADD_FAILURE() << "error occurred while receiving HTTP" " response from the server: " << ec.message(); - io_service_.stop(); + io_service_->stop(); } } @@ -156,7 +156,7 @@ public: // expecting. if (response_.find("\r\n\r\n", 0) != std::string::npos) { receive_done_ = true; - io_service_.stop(); + io_service_->stop(); } else { receivePartialResponse(); } @@ -245,8 +245,8 @@ public: private: - /// @brief Holds reference to the IO service. - boost::asio::io_service& io_service_; + /// @brief Holds pointer to the IO service. + isc::asiolink::IOServicePtr io_service_; /// @brief A socket used for the connection. boost::asio::ip::tcp::socket socket_; diff --git a/src/lib/http/tests/tls_client_unittests.cc b/src/lib/http/tests/tls_client_unittests.cc index 8874214421..4309a87456 100644 --- a/src/lib/http/tests/tls_client_unittests.cc +++ b/src/lib/http/tests/tls_client_unittests.cc @@ -227,7 +227,7 @@ public: /// /// Starts test timer which detects timeouts. HttpListenerTest() - : io_service_(), factory_(new TestHttpResponseCreatorFactory()), + : io_service_(new IOService()), factory_(new TestHttpResponseCreatorFactory()), test_timer_(io_service_), run_io_service_timer_(io_service_) { test_timer_.setup(std::bind(&HttpListenerTest::timeoutHandler, this, true), TEST_TIMEOUT, IntervalTimer::ONE_SHOT); @@ -242,7 +242,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Runs IO service with optional timeout. @@ -250,20 +250,20 @@ public: /// @param timeout Optional value specifying for how long the io service /// should be ran (ms). void runIOService(long timeout = 0) { - io_service_.restart(); + io_service_->restart(); if (timeout > 0) { run_io_service_timer_.setup(std::bind(&HttpListenerTest::timeoutHandler, this, false), timeout, IntervalTimer::ONE_SHOT); } - io_service_.run(); - io_service_.restart(); - io_service_.poll(); + io_service_->run(); + io_service_->restart(); + io_service_->poll(); } /// @brief IO service used in the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Pointer to the response creator factory. HttpResponseCreatorFactoryPtr factory_; @@ -315,7 +315,7 @@ public: listener_->stop(); listener2_->stop(); listener3_->stop(); - io_service_.poll(); + io_service_->poll(); MultiThreadingMgr::instance().setMode(false); HttpRequest::recordSubject_ = false; HttpRequest::recordIssuer_ = false; @@ -372,7 +372,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -388,7 +388,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -437,7 +437,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -453,7 +453,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -501,7 +501,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -517,7 +517,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -562,7 +562,7 @@ public: request1, response1, [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); } @@ -587,7 +587,7 @@ public: request2, response2, [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); } @@ -622,7 +622,7 @@ public: [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); // The server should have returned an IO error. if (!ec) { ADD_FAILURE() << "asyncSendRequest didn't fail"; @@ -657,7 +657,7 @@ public: [this](const boost::system::error_code& ec, const HttpResponsePtr& response, const std::string& parsing_error) { - io_service_.stop(); + io_service_->stop(); // There should be no IO error (answer from the server is received). if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -700,7 +700,7 @@ public: const HttpResponsePtr& response, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } // In this particular case we know exactly the type of the // IO error returned, because the client explicitly sets this @@ -728,7 +728,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } })); @@ -759,7 +759,7 @@ public: const HttpResponsePtr& response, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } // In this particular case we know exactly the type of the // IO error returned, because the client explicitly sets this @@ -786,7 +786,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++cb_num > 1) { - io_service_.stop(); + io_service_->stop(); } })); @@ -880,7 +880,7 @@ public: [this](const boost::system::error_code& ec, const HttpResponsePtr&, const std::string&) { - io_service_.stop(); + io_service_->stop(); // Everything should be ok. if (ec) { @@ -918,7 +918,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { @@ -940,7 +940,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num > 1) { - io_service_.stop(); + io_service_->stop(); } if (ec) { ADD_FAILURE() << "asyncSendRequest failed: " << ec.message(); @@ -1017,7 +1017,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num == 1) { - io_service_.stop(); + io_service_->stop(); } // We should have 1 connect. @@ -1084,7 +1084,7 @@ public: const HttpResponsePtr&, const std::string&) { if (++resp_num == 1) { - io_service_.stop(); + io_service_->stop(); } // We should have 1 connect. diff --git a/src/lib/http/tests/tls_server_unittests.cc b/src/lib/http/tests/tls_server_unittests.cc index f5c592ce6b..db788ce56f 100644 --- a/src/lib/http/tests/tls_server_unittests.cc +++ b/src/lib/http/tests/tls_server_unittests.cc @@ -212,7 +212,7 @@ template<typename HttpConnectionType> class HttpListenerImplCustom : public HttpListenerImpl { public: - HttpListenerImplCustom(IOService& io_service, + HttpListenerImplCustom(const IOServicePtr& io_service, const IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, @@ -276,7 +276,7 @@ public: /// /// @throw HttpListenerError when any of the specified parameters is /// invalid. - HttpListenerCustom(IOService& io_service, + HttpListenerCustom(const IOServicePtr& io_service, const IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, @@ -314,7 +314,7 @@ public: /// @param request_timeout Configured timeout for a HTTP request. /// @param idle_timeout Timeout after which persistent HTTP connection is /// closed by the server. - HttpConnectionLongWriteBuffer(IOService& io_service, + HttpConnectionLongWriteBuffer(const IOServicePtr& io_service, const HttpAcceptorPtr& acceptor, const TlsContextPtr& tls_context, HttpConnectionPool& connection_pool, @@ -361,7 +361,7 @@ public: /// @param request_timeout Configured timeout for a HTTP request. /// @param idle_timeout Timeout after which persistent HTTP connection is /// closed by the server. - HttpConnectionTransactionChange(IOService& io_service, + HttpConnectionTransactionChange(const IOServicePtr& io_service, const HttpAcceptorPtr& acceptor, const TlsContextPtr& tls_context, HttpConnectionPool& connection_pool, @@ -406,10 +406,9 @@ public: /// /// @param io_service IO service to be stopped on error. /// @param tls_context TLS context. - TestHttpClient(IOService& io_service, TlsContextPtr tls_context) - : io_service_(io_service.getInternalIOService()), - stream_(io_service_, tls_context->getContext()), - buf_(), response_() { + TestHttpClient(const IOServicePtr& io_service, TlsContextPtr tls_context) + : io_service_(io_service), stream_(io_service_->getInternalIOService(), + tls_context->getContext()), buf_(), response_() { } /// @brief Destructor. @@ -438,7 +437,7 @@ public: if (ec.value() != boost::asio::error::in_progress) { ADD_FAILURE() << "error occurred while connecting: " << ec.message(); - io_service_.stop(); + io_service_->stop(); return; } } @@ -447,7 +446,7 @@ public: if (ec) { ADD_FAILURE() << "error occurred during handshake: " << ec.message(); - io_service_.stop(); + io_service_->stop(); return; } sendRequest(request); @@ -483,7 +482,7 @@ public: } else { ADD_FAILURE() << "error occurred while connecting: " << ec.message(); - io_service_.stop(); + io_service_->stop(); return; } } @@ -526,7 +525,7 @@ public: // Error occurred, bail... ADD_FAILURE() << "error occurred while receiving HTTP" " response from the server: " << ec.message(); - io_service_.stop(); + io_service_->stop(); } } @@ -538,7 +537,7 @@ public: // Two consecutive new lines end the part of the response we're // expecting. if (response_.find("\r\n\r\n", 0) != std::string::npos) { - io_service_.stop(); + io_service_->stop(); } else { receivePartialResponse(); @@ -620,8 +619,8 @@ public: private: - /// @brief Holds reference to the IO service. - boost::asio::io_service& io_service_; + /// @brief Holds pointer to the IO service. + isc::asiolink::IOServicePtr io_service_; /// @brief A socket used for the connection. TlsStreamImpl stream_; @@ -644,7 +643,7 @@ public: /// /// Starts test timer which detects timeouts. HttpsListenerTest() - : io_service_(), factory_(new TestHttpResponseCreatorFactory()), + : io_service_(new IOService()), factory_(new TestHttpResponseCreatorFactory()), test_timer_(io_service_), run_io_service_timer_(io_service_), clients_(), server_context_(), client_context_() { configServer(server_context_); @@ -684,7 +683,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Runs IO service with optional timeout. @@ -692,16 +691,16 @@ public: /// @param timeout Optional value specifying for how long the io service /// should be ran. void runIOService(long timeout = 0) { - io_service_.restart(); + io_service_->restart(); if (timeout > 0) { run_io_service_timer_.setup(std::bind(&HttpsListenerTest::timeoutHandler, this, false), timeout, IntervalTimer::ONE_SHOT); } - io_service_.run(); - io_service_.restart(); - io_service_.poll(); + io_service_->run(); + io_service_->restart(); + io_service_->poll(); } /// @brief Returns HTTP OK response expected by unit tests. @@ -803,7 +802,7 @@ public: } /// @brief IO service used in the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Pointer to the response creator factory. HttpResponseCreatorFactoryPtr factory_; @@ -848,7 +847,7 @@ TEST_F(HttpsListenerTest, listen) { EXPECT_EQ(httpOk(HttpVersion::HTTP_11()), client->getResponse()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } @@ -900,7 +899,7 @@ TEST_F(HttpsListenerTest, keepAlive) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that persistent HTTP connection is established by default @@ -949,7 +948,7 @@ TEST_F(HttpsListenerTest, persistentConnection) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that "keep-alive" connection is closed by the server after @@ -1008,7 +1007,7 @@ TEST_F(HttpsListenerTest, keepAliveTimeout) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that persistent connection is closed by the server after @@ -1065,7 +1064,7 @@ TEST_F(HttpsListenerTest, persistentConnectionTimeout) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that HTTP/1.1 connection remains open even if there is an @@ -1118,7 +1117,7 @@ TEST_F(HttpsListenerTest, persistentConnectionBadBody) { EXPECT_TRUE(client->isConnectionClosed()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that the HTTP listener can't be started twice. @@ -1193,7 +1192,7 @@ TEST_F(HttpsListenerTest, invalidIdleTimeout) { // This test verifies that listener can't be bound to the port to which // other server is bound. TEST_F(HttpsListenerTest, addressInUse) { - tcp::acceptor acceptor(io_service_.getInternalIOService()); + tcp::acceptor acceptor(io_service_->getInternalIOService()); // Use other port than SERVER_PORT to make sure that this TCP connection // doesn't affect subsequent tests. tcp::endpoint endpoint(address::from_string(SERVER_ADDRESS), diff --git a/src/lib/process/tests/d_controller_unittests.cc b/src/lib/process/tests/d_controller_unittests.cc index c927b7521b..e52cbab9db 100644 --- a/src/lib/process/tests/d_controller_unittests.cc +++ b/src/lib/process/tests/d_controller_unittests.cc @@ -249,7 +249,7 @@ TEST_F(DStubControllerTest, missingConfigFileArgument) { TEST_F(DStubControllerTest, launchRuntimeError) { // Use an asiolink IntervalTimer and callback to generate the // shutdown invocation. (Note IntervalTimer setup is in milliseconds). - isc::asiolink::IntervalTimer timer(*getIOService()); + isc::asiolink::IntervalTimer timer(getIOService()); timer.setup(genFatalErrorCallback, 2000); // Write the valid, empty, config and then run launch() for 5000 ms @@ -337,9 +337,9 @@ TEST_F(DStubControllerTest, ioSignals) { controller_->recordSignalOnly(true); // Setup to raise SIGHUP in 10 ms. - TimedSignal sighup(*getIOService(), SIGHUP, 10); - TimedSignal sigint(*getIOService(), SIGINT, 100); - TimedSignal sigterm(*getIOService(), SIGTERM, 200); + TimedSignal sighup(getIOService(), SIGHUP, 10); + TimedSignal sigint(getIOService(), SIGINT, 100); + TimedSignal sigterm(getIOService(), SIGTERM, 200); // Write the valid, empty, config and then run launch() for 500 ms time_duration elapsed_time; @@ -362,7 +362,7 @@ TEST_F(DStubControllerTest, invalidConfigReload) { scheduleTimedWrite("{ \"string_test\": BOGUS JSON }", 100); // Setup to raise SIGHUP in 200 ms. - TimedSignal sighup(*getIOService(), SIGHUP, 200); + TimedSignal sighup(getIOService(), SIGHUP, 200); // Write the config and then run launch() for 500 ms // After startup, which will load the initial configuration this enters @@ -383,7 +383,7 @@ TEST_F(DStubControllerTest, alternateParsing) { controller_->useAlternateParser(true); // Setup to raise SIGHUP in 200 ms. - TimedSignal sighup(*getIOService(), SIGHUP, 200); + TimedSignal sighup(getIOService(), SIGHUP, 200); // Write the config and then run launch() for 500 ms // After startup, which will load the initial configuration this enters @@ -406,8 +406,8 @@ TEST_F(DStubControllerTest, validConfigReload) { scheduleTimedWrite("{ \"string_test\": \"second value\" }", 100); // Setup to raise SIGHUP in 200 ms and another at 400 ms. - TimedSignal sighup(*getIOService(), SIGHUP, 200); - TimedSignal sighup2(*getIOService(), SIGHUP, 400); + TimedSignal sighup(getIOService(), SIGHUP, 200); + TimedSignal sighup2(getIOService(), SIGHUP, 400); // Write the config and then run launch() for 800 ms time_duration elapsed_time; @@ -423,7 +423,7 @@ TEST_F(DStubControllerTest, validConfigReload) { // Tests that the SIGINT triggers a normal shutdown. TEST_F(DStubControllerTest, sigintShutdown) { // Setup to raise SIGHUP in 1 ms. - TimedSignal sighup(*getIOService(), SIGINT, 1); + TimedSignal sighup(getIOService(), SIGINT, 1); // Write the config and then run launch() for 1000 ms time_duration elapsed_time; @@ -452,7 +452,7 @@ TEST_F(DStubControllerTest, getVersion) { // Tests that the SIGTERM triggers a normal shutdown. TEST_F(DStubControllerTest, sigtermShutdown) { // Setup to raise SIGHUP in 1 ms. - TimedSignal sighup(*getIOService(), SIGTERM, 1); + TimedSignal sighup(getIOService(), SIGTERM, 1); // Write the config and then run launch() for 1000 ms time_duration elapsed_time; diff --git a/src/lib/process/testutils/d_test_stubs.cc b/src/lib/process/testutils/d_test_stubs.cc index ec9eb3b1b8..c9f23598b4 100644 --- a/src/lib/process/testutils/d_test_stubs.cc +++ b/src/lib/process/testutils/d_test_stubs.cc @@ -194,7 +194,7 @@ void DControllerTest::scheduleTimedWrite(const std::string& config, int write_time_ms) { new_cfg_content_ = config; - write_timer_.reset(new asiolink::IntervalTimer(*getIOService())); + write_timer_.reset(new asiolink::IntervalTimer(getIOService())); write_timer_->setup(std::bind(&DControllerTest::timedWriteCallback, this), write_time_ms, asiolink::IntervalTimer::ONE_SHOT); } @@ -206,7 +206,7 @@ DControllerTest::runWithConfig(const std::string& config, int run_time_ms, writeFile(config); // Shutdown (without error) after runtime. - isc::asiolink::IntervalTimer timer(*getIOService()); + isc::asiolink::IntervalTimer timer(getIOService()); timer.setup(genShutdownCallback, run_time_ms); // Record start time, and invoke launch(). @@ -236,7 +236,7 @@ DControllerTest::runWithConfig(const std::string& config, int run_time_ms, writeFile(config); // Shutdown (without error) after runtime. - isc::asiolink::IntervalTimer timer(*getIOService()); + isc::asiolink::IntervalTimer timer(getIOService()); timer.setup([&] { callback(); genShutdownCallback(); }, run_time_ms); // Record start time, and invoke launch(). diff --git a/src/lib/tcp/mt_tcp_listener_mgr.cc b/src/lib/tcp/mt_tcp_listener_mgr.cc index a8afa6d965..aca4f1d650 100644 --- a/src/lib/tcp/mt_tcp_listener_mgr.cc +++ b/src/lib/tcp/mt_tcp_listener_mgr.cc @@ -57,7 +57,7 @@ MtTcpListenerMgr::start() { thread_io_service_.reset(new IOService()); // Create a new TCPListener derivation using the factory. - tcp_listener_ = listener_factory_(*thread_io_service_, + tcp_listener_ = listener_factory_(thread_io_service_, address_, port_, tls_context_, diff --git a/src/lib/tcp/mt_tcp_listener_mgr.h b/src/lib/tcp/mt_tcp_listener_mgr.h index 6fc2600bb7..cba368a5fe 100644 --- a/src/lib/tcp/mt_tcp_listener_mgr.h +++ b/src/lib/tcp/mt_tcp_listener_mgr.h @@ -22,7 +22,7 @@ const long TCP_IDLE_CONNECTION_TIMEOUT = 300 * 1000; /// @brief Defines a factory function for creating TcpListeners. typedef std::function< - TcpListenerPtr(asiolink::IOService& io_service, + TcpListenerPtr(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const asiolink::TlsContextPtr& tls_context, diff --git a/src/lib/tcp/tcp_connection.cc b/src/lib/tcp/tcp_connection.cc index d0e5393048..0445b35a90 100644 --- a/src/lib/tcp/tcp_connection.cc +++ b/src/lib/tcp/tcp_connection.cc @@ -48,7 +48,7 @@ SocketCallback::operator()(boost::system::error_code ec, size_t length) { callback_(ec, length); } -TcpConnection::TcpConnection(asiolink::IOService& io_service, +TcpConnection::TcpConnection(const asiolink::IOServicePtr& io_service, const TcpConnectionAcceptorPtr& acceptor, const TlsContextPtr& tls_context, TcpConnectionPool& connection_pool, @@ -56,7 +56,8 @@ TcpConnection::TcpConnection(asiolink::IOService& io_service, const TcpConnectionFilterCallback& connection_filter, const long idle_timeout, const size_t read_max /* = 32768 */) - : tls_context_(tls_context), + : io_service_(io_service), + tls_context_(tls_context), idle_timeout_(idle_timeout), idle_timer_(io_service), tcp_socket_(), diff --git a/src/lib/tcp/tcp_connection.h b/src/lib/tcp/tcp_connection.h index 8b71d077f8..7212d45c6a 100644 --- a/src/lib/tcp/tcp_connection.h +++ b/src/lib/tcp/tcp_connection.h @@ -208,7 +208,7 @@ public: /// @param idle_timeout Timeout after which a TCP connection is /// closed by the server. /// @param read_max maximum size of a single socket read. Defaults to 32K. - TcpConnection(asiolink::IOService& io_service, + TcpConnection(const asiolink::IOServicePtr& io_service, const TcpConnectionAcceptorPtr& acceptor, const asiolink::TlsContextPtr& tls_context, TcpConnectionPool& connection_pool, @@ -422,6 +422,9 @@ protected: return (input_buf_.size()); } + /// @brief The IO service used to handle events. + asiolink::IOServicePtr io_service_; + /// @brief TLS context. asiolink::TlsContextPtr tls_context_; diff --git a/src/lib/tcp/tcp_listener.cc b/src/lib/tcp/tcp_listener.cc index dd327ae994..b668ee39a6 100644 --- a/src/lib/tcp/tcp_listener.cc +++ b/src/lib/tcp/tcp_listener.cc @@ -14,7 +14,7 @@ namespace ph = std::placeholders; namespace isc { namespace tcp { -TcpListener::TcpListener(IOService& io_service, +TcpListener::TcpListener(const IOServicePtr& io_service, const IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, diff --git a/src/lib/tcp/tcp_listener.h b/src/lib/tcp/tcp_listener.h index 26f74c5ccd..0045c69a55 100644 --- a/src/lib/tcp/tcp_listener.h +++ b/src/lib/tcp/tcp_listener.h @@ -56,7 +56,7 @@ public: /// /// @throw TcpListenerError when any of the specified parameters is /// invalid. - TcpListener(asiolink::IOService& io_service, + TcpListener(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const asiolink::TlsContextPtr& tls_context, @@ -135,8 +135,8 @@ protected: const TcpConnectionAcceptorCallback& acceptor_callback, const TcpConnectionFilterCallback& connection_filter); - /// @brief Reference to the IO service. - asiolink::IOService& io_service_; + /// @brief Pointer to the IO service. + asiolink::IOServicePtr io_service_; /// @brief TLS context. asiolink::TlsContextPtr tls_context_; diff --git a/src/lib/tcp/tests/mt_tcp_listener_mgr_unittests.cc b/src/lib/tcp/tests/mt_tcp_listener_mgr_unittests.cc index ab561c6010..782d7efb3e 100644 --- a/src/lib/tcp/tests/mt_tcp_listener_mgr_unittests.cc +++ b/src/lib/tcp/tests/mt_tcp_listener_mgr_unittests.cc @@ -51,7 +51,7 @@ public: /// /// Starts test timer which detects timeouts, and enables multi-threading mode. MtTcpListenerMgrTest() - : mt_listener_mgr_(), io_service_(), test_timer_(io_service_), + : mt_listener_mgr_(), io_service_(new IOService()), test_timer_(io_service_), run_io_service_timer_(io_service_), clients_(), num_threads_(), num_clients_(), num_in_progress_(0), num_finished_(0), chunk_size_(0), pause_cnt_(0), response_handler_(0) { @@ -112,7 +112,7 @@ public: } /// @brief TcpListener factory for MtTcpListener to instantiate new listeners. - TcpListenerPtr listenerFactory(asiolink::IOService& io_service, + TcpListenerPtr listenerFactory(const asiolink::IOServicePtr& io_service, const asiolink::IOAddress& server_address, const unsigned short server_port, const asiolink::TlsContextPtr& tls_context, @@ -135,7 +135,7 @@ public: /// /// @param fail_on_timeout Specifies if test failure should be reported. void clientDone() { - io_service_.stop(); + io_service_->stop(); } /// @brief Initiates a command via a new TCP client. @@ -206,7 +206,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Runs IO service with optional timeout. @@ -227,10 +227,10 @@ public: size_t num_done = 0; while (num_done != request_limit) { // Always call restart() before we call run(); - io_service_.restart(); + io_service_->restart(); // Run until a client stops the service. - io_service_.run(); + io_service_->run(); // If all the clients are done receiving, the test is done. num_done = 0; @@ -428,7 +428,7 @@ public: // Create an MtTcpListenerMgr with prescribed number of threads. createMtTcpListenerMgr(num_threads, std::bind(&MtTcpListenerMgrTest::synchronizedCommandHandler, - this, ph::_1)); + this, ph::_1)); // Start it and verify it is running. ASSERT_NO_THROW_LOG(mt_listener_mgr_->start()); @@ -703,7 +703,7 @@ public: MtTcpListenerMgrPtr mt_listener_mgr_; /// @brief IO service used in drive the test and test clients. - IOService io_service_; + IOServicePtr io_service_; /// @brief Asynchronous timer service to detect timeouts. IntervalTimer test_timer_; diff --git a/src/lib/tcp/tests/tcp_listener_unittests.cc b/src/lib/tcp/tests/tcp_listener_unittests.cc index cd91f20bfa..e2b906bae6 100644 --- a/src/lib/tcp/tests/tcp_listener_unittests.cc +++ b/src/lib/tcp/tests/tcp_listener_unittests.cc @@ -64,7 +64,7 @@ public: /// /// Starts test timer which detects timeouts. TcpListenerTest() - : io_service_(), test_timer_(io_service_), + : io_service_(new IOService()), test_timer_(io_service_), run_io_service_timer_(io_service_), clients_(), clients_done_(0) { test_timer_.setup(std::bind(&TcpListenerTest::timeoutHandler, this, true), @@ -129,7 +129,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Callback function each client invokes when done. @@ -141,7 +141,7 @@ public: ++clients_done_; if (clients_done_ >= clients_.size()) { // They're all done or dead. Stop the service. - io_service_.stop(); + io_service_->stop(); } } @@ -150,7 +150,7 @@ public: /// @param timeout Optional value specifying for how long the io service /// should be ran. void runIOService(long timeout = 0) { - io_service_.restart(); + io_service_->restart(); if (timeout > 0) { run_io_service_timer_.setup(std::bind(&TcpListenerTest::timeoutHandler, @@ -158,9 +158,9 @@ public: timeout, IntervalTimer::ONE_SHOT); } - io_service_.run(); - io_service_.restart(); - io_service_.poll(); + io_service_->run(); + io_service_->restart(); + io_service_->poll(); } /// @brief Filter that denies every other connection. @@ -182,7 +182,7 @@ public: } /// @brief IO service used in the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Asynchronous timer service to detect timeouts. IntervalTimer test_timer_; @@ -234,7 +234,7 @@ TEST_F(TcpListenerTest, listen) { ASSERT_EQ(expected_entries, listener.audit_trail_->getConnectionTrail(1)); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that a TCP connection can receive a complete @@ -266,7 +266,7 @@ TEST_F(TcpListenerTest, splitReads) { EXPECT_FALSE(client->expectedEof()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that a TCP connection can be established and used to @@ -295,7 +295,7 @@ TEST_F(TcpListenerTest, idleTimeoutTest) { EXPECT_TRUE(client->expectedEof()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } TEST_F(TcpListenerTest, multipleClientsListen) { @@ -335,7 +335,7 @@ TEST_F(TcpListenerTest, multipleClientsListen) { } listener.stop(); - io_service_.poll(); + io_service_->poll(); } // Verify that the listener handles multiple requests for multiple @@ -388,7 +388,7 @@ TEST_F(TcpListenerTest, multipleRequetsPerClients) { } listener.stop(); - io_service_.poll(); + io_service_->poll(); } // Verify that connection filtering can eliminate specific connections. @@ -450,7 +450,7 @@ TEST_F(TcpListenerTest, filterClientsTest) { } listener.stop(); - io_service_.poll(); + io_service_->poll(); } // Exercises TcpStreamRequest::postBuffer() through various diff --git a/src/lib/tcp/tests/tcp_test_client.h b/src/lib/tcp/tests/tcp_test_client.h index f58e3873c3..94be72f34d 100644 --- a/src/lib/tcp/tests/tcp_test_client.h +++ b/src/lib/tcp/tests/tcp_test_client.h @@ -77,13 +77,13 @@ public: /// @param tls_context /// @param server_address string containing the IP address of the server. /// @param port port number of the server. - explicit TcpTestClient(isc::asiolink::IOService& io_service, + explicit TcpTestClient(const isc::asiolink::IOServicePtr& io_service, std::function<void()> done_callback, isc::asiolink::TlsContextPtr tls_context = isc::asiolink::TlsContextPtr(), const std::string& server_address = "127.0.0.1", uint16_t port = 18123) - : io_service_(io_service.getInternalIOService()), + : io_service_(io_service), tls_context_(tls_context), tcp_socket_(), tls_socket_(), done_callback_(done_callback), @@ -382,8 +382,8 @@ public: private: - /// @brief Holds reference to the IO service. - boost::asio::io_service& io_service_; + /// @brief Holds pointer to the IO service. + isc::asiolink::IOServicePtr io_service_; /// @brief TLS context. isc::asiolink::TlsContextPtr tls_context_; diff --git a/src/lib/tcp/tests/tcp_test_listener.h b/src/lib/tcp/tests/tcp_test_listener.h index 2b28fb7855..44d9d372b2 100644 --- a/src/lib/tcp/tests/tcp_test_listener.h +++ b/src/lib/tcp/tests/tcp_test_listener.h @@ -121,7 +121,7 @@ public: typedef std::function<std::string(const std::string&)> ResponseHandler; /// @brief Constructor - TcpTestConnection(IOService& io_service, + TcpTestConnection(const IOServicePtr& io_service, const TcpConnectionAcceptorPtr& acceptor, const TlsContextPtr& tls_context, TcpConnectionPool& connection_pool, @@ -232,7 +232,7 @@ typedef boost::shared_ptr<TcpTestConnection> TcpTestConnectionPtr; class TcpTestListener : public TcpListener { public: /// @brief Constructor - TcpTestListener(IOService& io_service, + TcpTestListener(const IOServicePtr& io_service, const IOAddress& server_address, const unsigned short server_port, const TlsContextPtr& tls_context, diff --git a/src/lib/tcp/tests/tls_listener_unittests.cc b/src/lib/tcp/tests/tls_listener_unittests.cc index a3b03d6f4b..6b7db45596 100644 --- a/src/lib/tcp/tests/tls_listener_unittests.cc +++ b/src/lib/tcp/tests/tls_listener_unittests.cc @@ -59,7 +59,7 @@ public: /// /// Starts test timer which detects timeouts. TlsListenerTest() - : io_service_(), test_timer_(io_service_), + : io_service_(new IOService()), test_timer_(io_service_), run_io_service_timer_(io_service_), clients_(), clients_done_(0) { test_timer_.setup(std::bind(&TlsListenerTest::timeoutHandler, this, true), @@ -139,7 +139,7 @@ public: if (fail_on_timeout) { ADD_FAILURE() << "Timeout occurred while running the test!"; } - io_service_.stop(); + io_service_->stop(); } /// @brief Callback function each client invokes when done. @@ -151,7 +151,7 @@ public: ++clients_done_; if (clients_done_ >= clients_.size()) { // They're all done or dead. Stop the service. - io_service_.stop(); + io_service_->stop(); } } @@ -160,7 +160,7 @@ public: /// @param timeout Optional value specifying for how long the io service /// should be ran. void runIOService(long timeout = 0) { - io_service_.restart(); + io_service_->restart(); if (timeout > 0) { run_io_service_timer_.setup(std::bind(&TlsListenerTest::timeoutHandler, @@ -168,9 +168,9 @@ public: timeout, IntervalTimer::ONE_SHOT); } - io_service_.run(); - io_service_.restart(); - io_service_.poll(); + io_service_->run(); + io_service_->restart(); + io_service_->poll(); } /// @brief Filter that denies every other connection. @@ -192,7 +192,7 @@ public: } /// @brief IO service used in the tests. - IOService io_service_; + IOServicePtr io_service_; /// @brief Asynchronous timer service to detect timeouts. IntervalTimer test_timer_; @@ -244,7 +244,7 @@ TEST_F(TlsListenerTest, listen) { ASSERT_EQ(expected_entries, listener.audit_trail_->getConnectionTrail(1)); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that a TLS connection is denied to a client @@ -305,7 +305,7 @@ TEST_F(TlsListenerTest, splitReads) { EXPECT_FALSE(client->expectedEof()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that a TLS connection can be established and used to @@ -334,7 +334,7 @@ TEST_F(TlsListenerTest, idleTimeoutTest) { EXPECT_TRUE(client->expectedEof()); listener.stop(); - io_service_.poll(); + io_service_->poll(); } // This test verifies that TLS connections with multiple clients. @@ -375,7 +375,7 @@ TEST_F(TlsListenerTest, multipleClientsListen) { } listener.stop(); - io_service_.poll(); + io_service_->poll(); } // Verify that the listener handles multiple requests for multiple @@ -428,7 +428,7 @@ TEST_F(TlsListenerTest, multipleRequetsPerClients) { } listener.stop(); - io_service_.poll(); + io_service_->poll(); } // Verify that connection filtering can eliminate specific connections. @@ -492,7 +492,7 @@ TEST_F(TlsListenerTest, filterClientsTest) { } listener.stop(); - io_service_.poll(); + io_service_->poll(); } } |