summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Gehring <juergen.gehring@bmw.de>2018-01-25 00:40:04 -0800
committerJuergen Gehring <juergen.gehring@bmw.de>2018-01-25 00:40:04 -0800
commite47085cbf1fb0e8daf958513161ab47e059dc275 (patch)
treef5048a0b45e11307f13d0274e9b43dbefd6e5623
parentc3e889f910121ad4aff92069c6a8a0bc4ff7520a (diff)
downloadvSomeIP-e47085cbf1fb0e8daf958513161ab47e059dc275.tar.gz
vsomeip 2.9.42.9.4
-rw-r--r--CHANGES4
-rw-r--r--CMakeLists.txt2
-rw-r--r--daemon/vsomeipd.cpp71
3 files changed, 66 insertions, 11 deletions
diff --git a/CHANGES b/CHANGES
index c52b348..2baf179 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
Changes
=======
+v2.9.4
+- Fixed deadlock on suspend to RAM / resume, triggered
+ by signal handler.
+
v2.9.3
- Fixed race condition on application shutdown
- Fixed bug that application object was not destroyed
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c2d2dae..364959f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,7 +8,7 @@ project (vsomeip)
set (VSOMEIP_MAJOR_VERSION 2)
set (VSOMEIP_MINOR_VERSION 9)
-set (VSOMEIP_PATCH_VERSION 3)
+set (VSOMEIP_PATCH_VERSION 4)
set (VSOMEIP_VERSION ${VSOMEIP_MAJOR_VERSION}.${VSOMEIP_MINOR_VERSION}.${VSOMEIP_PATCH_VERSION})
set (PACKAGE_VERSION ${VSOMEIP_VERSION}) # Used in documentatin/doxygen.in
set (CMAKE_VERBOSE_MAKEFILE off)
diff --git a/daemon/vsomeipd.cpp b/daemon/vsomeipd.cpp
index 0fb88c9..0cff747 100644
--- a/daemon/vsomeipd.cpp
+++ b/daemon/vsomeipd.cpp
@@ -7,6 +7,8 @@
#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
+#include <thread>
+#include <condition_variable>
#include <iostream>
@@ -20,23 +22,29 @@
#endif
static std::shared_ptr<vsomeip::application> its_application;
+static vsomeip::routing_state_e routing_state = vsomeip::routing_state_e::RS_RUNNING;
+static bool stop_application = false;
+static bool stop_sighandler = false;
+static std::condition_variable_any sighandler_condition;
+static std::recursive_mutex sighandler_mutex;
#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
/*
* Handle signal to stop the daemon
*/
void vsomeipd_stop(int _signal) {
+ // Do not log messages in signal handler as this can cause deadlock in boost logger
if (_signal == SIGINT || _signal == SIGTERM) {
- its_application->stop();
+ stop_application = true;
}
if (_signal == SIGUSR1) {
- VSOMEIP_INFO << "Suspending service discovery";
- its_application->set_routing_state(vsomeip::routing_state_e::RS_SUSPENDED);
+ routing_state = vsomeip::routing_state_e::RS_SUSPENDED;
}
if (_signal == SIGUSR2) {
- VSOMEIP_INFO << "Resuming service discovery";
- its_application->set_routing_state(vsomeip::routing_state_e::RS_RESUMED);
+ routing_state = vsomeip::routing_state_e::RS_RESUMED;
}
+ std::unique_lock<std::recursive_mutex> its_lock(sighandler_mutex);
+ sighandler_condition.notify_one();
}
#endif
@@ -61,19 +69,56 @@ int vsomeipd_process(bool _is_quiet) {
// Create the application object
its_application = its_runtime->create_application(VSOMEIP_ROUTING);
#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
- // Handle signals
- signal(SIGINT, vsomeipd_stop);
- signal(SIGTERM, vsomeipd_stop);
- signal(SIGUSR1, vsomeipd_stop);
- signal(SIGUSR2, vsomeipd_stop);
+ std::thread sighandler_thread([]() {
+ // Unblock signals for this thread only
+ sigset_t handler_mask;
+ sigemptyset(&handler_mask);
+ sigaddset(&handler_mask, SIGUSR2);
+ sigaddset(&handler_mask, SIGUSR1);
+ sigaddset(&handler_mask, SIGTERM);
+ sigaddset(&handler_mask, SIGINT);
+ sigaddset(&handler_mask, SIGSEGV);
+ sigaddset(&handler_mask, SIGABRT);
+ pthread_sigmask(SIG_UNBLOCK, &handler_mask, NULL);
+
+ // Handle the following signals
+ signal(SIGINT, vsomeipd_stop);
+ signal(SIGTERM, vsomeipd_stop);
+ signal(SIGUSR1, vsomeipd_stop);
+ signal(SIGUSR2, vsomeipd_stop);
+
+ while (!stop_sighandler) {
+ std::unique_lock<std::recursive_mutex> its_lock(sighandler_mutex);
+ sighandler_condition.wait(its_lock);
+
+ if (stop_application) {
+ its_application->stop();
+ return;
+ } else if (routing_state == vsomeip::routing_state_e::RS_RESUMED ||
+ routing_state == vsomeip::routing_state_e::RS_SUSPENDED){
+ VSOMEIP_INFO << "Received signal for setting routing_state to: 0x"
+ << std::hex << static_cast<int>(routing_state );
+ its_application->set_routing_state(routing_state);
+ }
+ }
+ });
#endif
if (its_application->init()) {
if (its_application->is_routing()) {
its_application->start();
+#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
+ sighandler_thread.join();
+#endif
return 0;
}
VSOMEIP_ERROR << "vsomeipd has not been configured as routing - abort";
}
+#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
+ std::unique_lock<std::recursive_mutex> its_lock(sighandler_mutex);
+ stop_sighandler = true;
+ sighandler_condition.notify_one();
+ sighandler_thread.join();
+#endif
return -1;
}
@@ -86,6 +131,12 @@ int vsomeipd_process(bool _is_quiet) {
* and start processing.
*/
int main(int argc, char **argv) {
+#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
+ // Block all signals
+ sigset_t mask;
+ sigfillset(&mask);
+ sigprocmask(SIG_SETMASK, &mask, NULL);
+#endif
bool must_daemonize(false);
bool is_quiet(false);
if (argc > 1) {