From 7a32fdd1f8f6aa5c31b8ffc99654ae7412eb6de3 Mon Sep 17 00:00:00 2001 From: Christian Eltzschig Date: Thu, 23 Jun 2022 11:19:36 +0200 Subject: [PATCH] iox-#751 Fix rpc c++ example by signalling waitset SIGTERM Signed-off-by: Christian Eltzschig --- .../request_response/client_cxx_waitset.cpp | 23 +++++++++++++++---- .../request_response_in_c/client_c_waitset.c | 9 +++----- .../posix_wrapper/unnamed_semaphore.cpp | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/iceoryx_examples/request_response/client_cxx_waitset.cpp b/iceoryx_examples/request_response/client_cxx_waitset.cpp index 88704092d4..9c00a1f017 100644 --- a/iceoryx_examples/request_response/client_cxx_waitset.cpp +++ b/iceoryx_examples/request_response/client_cxx_waitset.cpp @@ -17,16 +17,19 @@ //! [iceoryx includes] #include "request_and_response_types.hpp" +#include "iceoryx_hoofs/posix_wrapper/signal_handler.hpp" #include "iceoryx_hoofs/posix_wrapper/signal_watcher.hpp" #include "iceoryx_posh/popo/client.hpp" #include "iceoryx_posh/popo/wait_set.hpp" #include "iceoryx_posh/runtime/posh_runtime.hpp" //! [iceoryx includes] +#include #include constexpr char APP_NAME[] = "iox-cpp-request-response-client-waitset"; - +std::atomic_bool keepRunning = {true}; +iox::cxx::optional> waitset; //! [context data to store Fibonacci numbers and sequence ids] struct ContextData @@ -38,8 +41,17 @@ struct ContextData }; //! [context data to store Fibonacci numbers and sequence ids] +void signalHandler(int) +{ + keepRunning = false; + waitset.and_then([&](auto& w) { w.markForDestruction(); }); +} + int main() { + auto sigTermGuard = iox::posix::registerSignalHandler(iox::posix::Signal::TERM, signalHandler); + auto sigIntGuard = iox::posix::registerSignalHandler(iox::posix::Signal::INT, signalHandler); + //! [initialize runtime] iox::runtime::PoshRuntime::initRuntime(APP_NAME); //! [initialize runtime] @@ -47,7 +59,7 @@ int main() ContextData ctx; //! [create waitset] - iox::popo::WaitSet<> waitset; + waitset.emplace(); //! [create client] iox::popo::ClientOptions options; @@ -56,14 +68,14 @@ int main() //! [create client] // attach client to waitset - waitset.attachState(client, iox::popo::ClientState::HAS_RESPONSE).or_else([](auto) { + waitset->attachState(client, iox::popo::ClientState::HAS_RESPONSE).or_else([](auto) { std::cerr << "failed to attach client" << std::endl; std::exit(EXIT_FAILURE); }); //! [create waitset] //! [mainloop] - while (!iox::posix::hasTerminationRequested()) + while (keepRunning) { //! [send request] client.loan() @@ -84,7 +96,7 @@ int main() // We block and wait for samples to arrive, when the time is up we send the request again //! [wait and check if the client triggered] - auto notificationVector = waitset.timedWait(iox::units::Duration::fromSeconds(5)); + auto notificationVector = waitset->timedWait(iox::units::Duration::fromSeconds(5)); for (auto& notification : notificationVector) { @@ -117,6 +129,7 @@ int main() } //! [mainloop] + waitset.reset(); std::cout << "shutting down" << std::endl; return (EXIT_SUCCESS); diff --git a/iceoryx_examples/request_response_in_c/client_c_waitset.c b/iceoryx_examples/request_response_in_c/client_c_waitset.c index 1420516d4c..5c6e8df157 100644 --- a/iceoryx_examples/request_response_in_c/client_c_waitset.c +++ b/iceoryx_examples/request_response_in_c/client_c_waitset.c @@ -59,7 +59,7 @@ int main() int64_t expectedResponseSequenceId = requestSequenceId; //! [create waitset and attach client] - iox_ws_t waitset = iox_ws_init(&waitsetStorage); + waitset = iox_ws_init(&waitsetStorage); if (iox_ws_attach_client_state(waitset, client, ClientState_HAS_RESPONSE, 0U, NULL) != WaitSetResult_SUCCESS) { @@ -136,11 +136,8 @@ int main() } //! [process responses] - if (keepRunning) - { - const uint32_t SLEEP_TIME_IN_MS = 950U; - sleep_for(SLEEP_TIME_IN_MS); - } + const uint32_t SLEEP_TIME_IN_MS = 950U; + sleep_for(SLEEP_TIME_IN_MS); } //! [cleanup] diff --git a/iceoryx_hoofs/source/posix_wrapper/unnamed_semaphore.cpp b/iceoryx_hoofs/source/posix_wrapper/unnamed_semaphore.cpp index 342a5a9b1c..3ff469a414 100644 --- a/iceoryx_hoofs/source/posix_wrapper/unnamed_semaphore.cpp +++ b/iceoryx_hoofs/source/posix_wrapper/unnamed_semaphore.cpp @@ -37,7 +37,7 @@ UnnamedSemaphoreBuilder::create(cxx::optional& uninitializedSe uninitializedSemaphore.emplace(); auto result = posixCall(iox_sem_init)(&uninitializedSemaphore.value().m_handle, - (m_isInterProcessCapable) ? 0 : 1, + (m_isInterProcessCapable) ? 1 : 0, static_cast(m_initialValue)) .failureReturnValue(-1) .evaluate();