core: add a facility to execute functions on the main io_service
Change-Id: I38e5f4ad5ed6798a14e0075fb7a14b792f8b2413 refs: #4683
This commit is contained in:
@@ -35,6 +35,7 @@ resetGlobalScheduler();
|
|||||||
} // namespace scheduler
|
} // namespace scheduler
|
||||||
|
|
||||||
static boost::thread_specific_ptr<boost::asio::io_service> g_ioService;
|
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;
|
static boost::asio::io_service* g_ribIoService = nullptr;
|
||||||
|
|
||||||
boost::asio::io_service&
|
boost::asio::io_service&
|
||||||
@@ -53,12 +54,25 @@ resetGlobalIoService()
|
|||||||
g_ioService.reset();
|
g_ioService.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setMainIoService(boost::asio::io_service* mainIo)
|
||||||
|
{
|
||||||
|
g_mainIoService = mainIo;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setRibIoService(boost::asio::io_service* ribIo)
|
setRibIoService(boost::asio::io_service* ribIo)
|
||||||
{
|
{
|
||||||
g_ribIoService = ribIo;
|
g_ribIoService = ribIo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::asio::io_service&
|
||||||
|
getMainIoService()
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(g_mainIoService != nullptr);
|
||||||
|
return *g_mainIoService;
|
||||||
|
}
|
||||||
|
|
||||||
boost::asio::io_service&
|
boost::asio::io_service&
|
||||||
getRibIoService()
|
getRibIoService()
|
||||||
{
|
{
|
||||||
@@ -66,6 +80,12 @@ getRibIoService()
|
|||||||
return *g_ribIoService;
|
return *g_ribIoService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runOnMainIoService(const std::function<void()>& f)
|
||||||
|
{
|
||||||
|
getMainIoService().post(f);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runOnRibIoService(const std::function<void()>& f)
|
runOnRibIoService(const std::function<void()>& f)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,14 +34,25 @@ namespace nfd {
|
|||||||
boost::asio::io_service&
|
boost::asio::io_service&
|
||||||
getGlobalIoService();
|
getGlobalIoService();
|
||||||
|
|
||||||
|
void
|
||||||
|
setMainIoService(boost::asio::io_service* mainIo);
|
||||||
|
|
||||||
void
|
void
|
||||||
setRibIoService(boost::asio::io_service* ribIo);
|
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
|
/** \brief run a function on the RIB io_service instance
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
runOnRibIoService(const std::function<void()>& f);
|
runOnRibIoService(const std::function<void()>& f);
|
||||||
|
|
||||||
|
boost::asio::io_service&
|
||||||
|
getMainIoService();
|
||||||
|
|
||||||
boost::asio::io_service&
|
boost::asio::io_service&
|
||||||
getRibIoService();
|
getRibIoService();
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ public:
|
|||||||
std::atomic_int retval(0);
|
std::atomic_int retval(0);
|
||||||
|
|
||||||
boost::asio::io_service* const mainIo = &getGlobalIoService();
|
boost::asio::io_service* const mainIo = &getGlobalIoService();
|
||||||
|
setMainIoService(mainIo);
|
||||||
boost::asio::io_service* ribIo = nullptr;
|
boost::asio::io_service* ribIo = nullptr;
|
||||||
|
|
||||||
// Mutex and conditional variable to implement synchronization between main and RIB manager
|
// Mutex and conditional variable to implement synchronization between main and RIB manager
|
||||||
|
|||||||
@@ -51,20 +51,31 @@ BOOST_AUTO_TEST_CASE(ThreadLocalGlobalIoService)
|
|||||||
BOOST_CHECK(s1 != s2);
|
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* mainIo = &g_io;
|
||||||
boost::asio::io_service* ribIo = g_ribIo;
|
boost::asio::io_service* ribIo = g_ribIo;
|
||||||
|
|
||||||
BOOST_CHECK(mainIo != ribIo);
|
BOOST_CHECK(mainIo != ribIo);
|
||||||
BOOST_CHECK(&getGlobalIoService() == mainIo);
|
BOOST_CHECK(&getGlobalIoService() == mainIo);
|
||||||
|
BOOST_CHECK(&getMainIoService() == mainIo);
|
||||||
BOOST_CHECK(&getRibIoService() == ribIo);
|
BOOST_CHECK(&getRibIoService() == ribIo);
|
||||||
auto mainThreadId = boost::this_thread::get_id();
|
auto mainThreadId = boost::this_thread::get_id();
|
||||||
|
|
||||||
runOnRibIoService([&] {
|
runOnRibIoService([&] {
|
||||||
BOOST_CHECK(mainThreadId != boost::this_thread::get_id());
|
BOOST_CHECK(mainThreadId != boost::this_thread::get_id());
|
||||||
BOOST_CHECK(&getRibIoService() == ribIo);
|
|
||||||
BOOST_CHECK(&getGlobalIoService() == 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 @@ BOOST_FIXTURE_TEST_CASE(PollInAllThreads, RibIoFixture)
|
|||||||
|
|
||||||
hasRibRun = false;
|
hasRibRun = false;
|
||||||
bool hasMainRun = false;
|
bool hasMainRun = false;
|
||||||
g_io.post([&] {
|
runOnMainIoService([&] {
|
||||||
hasMainRun = true;
|
hasMainRun = true;
|
||||||
runOnRibIoService([&] { hasRibRun = true; });
|
runOnRibIoService([&] { hasRibRun = true; });
|
||||||
});
|
});
|
||||||
BOOST_CHECK_EQUAL(hasMainRun, false);
|
BOOST_CHECK_EQUAL(hasMainRun, false);
|
||||||
BOOST_CHECK_EQUAL(hasRibRun, false);
|
BOOST_CHECK_EQUAL(hasRibRun, false);
|
||||||
|
|
||||||
@@ -105,9 +116,9 @@ BOOST_FIXTURE_TEST_CASE(AdvanceClocks, RibIoTimeFixture)
|
|||||||
hasRibRun = false;
|
hasRibRun = false;
|
||||||
bool hasMainRun = false;
|
bool hasMainRun = false;
|
||||||
scheduler::schedule(250_ms, [&] {
|
scheduler::schedule(250_ms, [&] {
|
||||||
hasMainRun = true;
|
hasMainRun = true;
|
||||||
runOnRibIoService([&] { hasRibRun = true; });
|
runOnRibIoService([&] { hasRibRun = true; });
|
||||||
});
|
});
|
||||||
BOOST_CHECK_EQUAL(hasMainRun, false);
|
BOOST_CHECK_EQUAL(hasMainRun, false);
|
||||||
BOOST_CHECK_EQUAL(hasRibRun, false);
|
BOOST_CHECK_EQUAL(hasRibRun, false);
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ RibIoFixture::RibIoFixture()
|
|||||||
std::mutex m;
|
std::mutex m;
|
||||||
std::condition_variable cv;
|
std::condition_variable cv;
|
||||||
|
|
||||||
|
g_mainIo = &getGlobalIoService();
|
||||||
|
setMainIoService(g_mainIo);
|
||||||
|
|
||||||
g_ribThread = boost::thread([&] {
|
g_ribThread = boost::thread([&] {
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m);
|
std::lock_guard<std::mutex> lock(m);
|
||||||
|
|||||||
@@ -56,6 +56,10 @@ protected:
|
|||||||
poll();
|
poll();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/** \brief pointer to global main io_service
|
||||||
|
*/
|
||||||
|
boost::asio::io_service* g_mainIo = nullptr;
|
||||||
|
|
||||||
/** \brief pointer to global RIB io_service
|
/** \brief pointer to global RIB io_service
|
||||||
*/
|
*/
|
||||||
boost::asio::io_service* g_ribIo = nullptr;
|
boost::asio::io_service* g_ribIo = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user