core: add a facility to execute functions on the main io_service
Change-Id: I38e5f4ad5ed6798a14e0075fb7a14b792f8b2413
refs: #4683
diff --git a/core/global-io.cpp b/core/global-io.cpp
index bd73244..f03d13c 100644
--- a/core/global-io.cpp
+++ b/core/global-io.cpp
@@ -35,6 +35,7 @@
} // namespace scheduler
static boost::thread_specific_ptr<boost::asio::io_service> g_ioService;
+static boost::asio::io_service* g_mainIoService = nullptr;
static boost::asio::io_service* g_ribIoService = nullptr;
boost::asio::io_service&
@@ -54,12 +55,25 @@
}
void
+setMainIoService(boost::asio::io_service* mainIo)
+{
+ g_mainIoService = mainIo;
+}
+
+void
setRibIoService(boost::asio::io_service* ribIo)
{
g_ribIoService = ribIo;
}
boost::asio::io_service&
+getMainIoService()
+{
+ BOOST_ASSERT(g_mainIoService != nullptr);
+ return *g_mainIoService;
+}
+
+boost::asio::io_service&
getRibIoService()
{
BOOST_ASSERT(g_ribIoService != nullptr);
@@ -67,6 +81,12 @@
}
void
+runOnMainIoService(const std::function<void()>& f)
+{
+ getMainIoService().post(f);
+}
+
+void
runOnRibIoService(const std::function<void()>& f)
{
getRibIoService().post(f);
diff --git a/core/global-io.hpp b/core/global-io.hpp
index ab0e17c..0fb2fbe 100644
--- a/core/global-io.hpp
+++ b/core/global-io.hpp
@@ -35,14 +35,25 @@
getGlobalIoService();
void
+setMainIoService(boost::asio::io_service* mainIo);
+
+void
setRibIoService(boost::asio::io_service* ribIo);
+/** \brief run a function on the main io_service instance
+ */
+void
+runOnMainIoService(const std::function<void()>& f);
+
/** \brief run a function on the RIB io_service instance
*/
void
runOnRibIoService(const std::function<void()>& f);
boost::asio::io_service&
+getMainIoService();
+
+boost::asio::io_service&
getRibIoService();
#ifdef WITH_TESTS
diff --git a/daemon/main.cpp b/daemon/main.cpp
index 448b105..f6d482d 100644
--- a/daemon/main.cpp
+++ b/daemon/main.cpp
@@ -105,6 +105,7 @@
std::atomic_int retval(0);
boost::asio::io_service* const mainIo = &getGlobalIoService();
+ setMainIoService(mainIo);
boost::asio::io_service* ribIo = nullptr;
// Mutex and conditional variable to implement synchronization between main and RIB manager
diff --git a/tests/core/global-io.t.cpp b/tests/core/global-io.t.cpp
index 8ae9126..5aa3bc6 100644
--- a/tests/core/global-io.t.cpp
+++ b/tests/core/global-io.t.cpp
@@ -51,20 +51,31 @@
BOOST_CHECK(s1 != s2);
}
-BOOST_FIXTURE_TEST_CASE(RibIoService, RibIoFixture)
+BOOST_FIXTURE_TEST_CASE(MainRibIoService, RibIoFixture)
{
boost::asio::io_service* mainIo = &g_io;
boost::asio::io_service* ribIo = g_ribIo;
BOOST_CHECK(mainIo != ribIo);
BOOST_CHECK(&getGlobalIoService() == mainIo);
+ BOOST_CHECK(&getMainIoService() == mainIo);
BOOST_CHECK(&getRibIoService() == ribIo);
auto mainThreadId = boost::this_thread::get_id();
runOnRibIoService([&] {
BOOST_CHECK(mainThreadId != boost::this_thread::get_id());
- BOOST_CHECK(&getRibIoService() == ribIo);
BOOST_CHECK(&getGlobalIoService() == ribIo);
+ BOOST_CHECK(&getMainIoService() == mainIo);
+ BOOST_CHECK(&getRibIoService() == ribIo);
+ });
+
+ runOnRibIoService([&] {
+ runOnMainIoService([&] {
+ BOOST_CHECK(mainThreadId == boost::this_thread::get_id());
+ BOOST_CHECK(&getGlobalIoService() == mainIo);
+ BOOST_CHECK(&getMainIoService() == mainIo);
+ BOOST_CHECK(&getRibIoService() == ribIo);
+ });
});
}
@@ -80,10 +91,10 @@
hasRibRun = false;
bool hasMainRun = false;
- g_io.post([&] {
- hasMainRun = true;
- runOnRibIoService([&] { hasRibRun = true; });
- });
+ runOnMainIoService([&] {
+ hasMainRun = true;
+ runOnRibIoService([&] { hasRibRun = true; });
+ });
BOOST_CHECK_EQUAL(hasMainRun, false);
BOOST_CHECK_EQUAL(hasRibRun, false);
@@ -105,9 +116,9 @@
hasRibRun = false;
bool hasMainRun = false;
scheduler::schedule(250_ms, [&] {
- hasMainRun = true;
- runOnRibIoService([&] { hasRibRun = true; });
- });
+ hasMainRun = true;
+ runOnRibIoService([&] { hasRibRun = true; });
+ });
BOOST_CHECK_EQUAL(hasMainRun, false);
BOOST_CHECK_EQUAL(hasRibRun, false);
diff --git a/tests/rib-io-fixture.cpp b/tests/rib-io-fixture.cpp
index ef228d5..d058851 100644
--- a/tests/rib-io-fixture.cpp
+++ b/tests/rib-io-fixture.cpp
@@ -35,6 +35,9 @@
std::mutex m;
std::condition_variable cv;
+ g_mainIo = &getGlobalIoService();
+ setMainIoService(g_mainIo);
+
g_ribThread = boost::thread([&] {
{
std::lock_guard<std::mutex> lock(m);
diff --git a/tests/rib-io-fixture.hpp b/tests/rib-io-fixture.hpp
index e89ba44..ec147d5 100644
--- a/tests/rib-io-fixture.hpp
+++ b/tests/rib-io-fixture.hpp
@@ -56,6 +56,10 @@
poll();
protected:
+ /** \brief pointer to global main io_service
+ */
+ boost::asio::io_service* g_mainIo = nullptr;
+
/** \brief pointer to global RIB io_service
*/
boost::asio::io_service* g_ribIo = nullptr;