From: Michal 'vorner' Vaner Date: Mon, 8 Apr 2013 11:37:55 +0000 (+0200) Subject: [2871] IOService::post() X-Git-Tag: bind10-1.1.0beta2-release~8^2~10^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=953b4dcd1d40790aafa513ed9be7409da2128ae9;p=thirdparty%2Fkea.git [2871] IOService::post() To execute a callback later, from the event loop. This is to be used in the fake resolution, instead of timer with 0 timeout (which doesn't work, we are strict with asserting invalid parameters). --- diff --git a/src/lib/asiolink/io_service.cc b/src/lib/asiolink/io_service.cc index 15fad0cd54..ad4ae942b7 100644 --- a/src/lib/asiolink/io_service.cc +++ b/src/lib/asiolink/io_service.cc @@ -63,6 +63,9 @@ public: /// It will eventually be removed once the wrapper interface is /// generalized. asio::io_service& get_io_service() { return io_service_; }; + void post(const boost::function& callback) { + io_service_.post(callback); + } private: asio::io_service io_service_; asio::io_service::work work_; @@ -96,5 +99,10 @@ IOService::get_io_service() { return (io_impl_->get_io_service()); } +void +IOService::post(const boost::function& callback) { + return (io_impl_->post(callback)); +} + } // namespace asiolink } // namespace isc diff --git a/src/lib/asiolink/io_service.h b/src/lib/asiolink/io_service.h index e0198ddf73..7e0da8fb53 100644 --- a/src/lib/asiolink/io_service.h +++ b/src/lib/asiolink/io_service.h @@ -15,6 +15,8 @@ #ifndef ASIOLINK_IO_SERVICE_H #define ASIOLINK_IO_SERVICE_H 1 +#include + namespace asio { class io_service; } @@ -70,6 +72,17 @@ public: /// generalized. asio::io_service& get_io_service(); + /// \brief Post a callback to the end of the queue. + /// + /// Requests the callback be called sometime later. It is not guaranteed + /// by the underlying asio, but it can reasonably be expected the callback + /// is put to the end of the callback queue. It is not called from within + /// this function. + /// + /// It may be used to implement "background" work, for example (doing stuff + /// by small bits that are called from time to time). + void post(const boost::function& callback); + private: IOServiceImpl* io_impl_; }; diff --git a/src/lib/asiolink/tests/Makefile.am b/src/lib/asiolink/tests/Makefile.am index b4018343cb..70b94dcec2 100644 --- a/src/lib/asiolink/tests/Makefile.am +++ b/src/lib/asiolink/tests/Makefile.am @@ -33,6 +33,7 @@ run_unittests_SOURCES += tcp_endpoint_unittest.cc run_unittests_SOURCES += tcp_socket_unittest.cc run_unittests_SOURCES += udp_endpoint_unittest.cc run_unittests_SOURCES += udp_socket_unittest.cc +run_unittests_SOURCES += io_service_unittest.cc run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) diff --git a/src/lib/asiolink/tests/io_service_unittest.cc b/src/lib/asiolink/tests/io_service_unittest.cc new file mode 100644 index 0000000000..2fe4f12722 --- /dev/null +++ b/src/lib/asiolink/tests/io_service_unittest.cc @@ -0,0 +1,48 @@ +// Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include + +#include +#include +#include + +using namespace isc::asiolink; + +namespace { + +void +postedEvent(std::vector* destination, int value) { + destination->push_back(value); +} + +// Check the posted events are called, in the same order they are posted. +TEST(IOService, post) { + std::vector called; + IOService service; + // Post two events + service.post(boost::bind(&postedEvent, &called, 1)); + service.post(boost::bind(&postedEvent, &called, 2)); + // They have not yet been called + EXPECT_TRUE(called.empty()); + // Process two events + service.run_one(); + service.run_one(); + // Both events were called in the right order + ASSERT_EQ(2, called.size()); + EXPECT_EQ(1, called[0]); + EXPECT_EQ(2, called[1]); +} + +}