From 8ed2251ee8df3e5d9ff87d9e0f698fe557fa9729 Mon Sep 17 00:00:00 2001 From: Jan Belle Date: Fri, 24 Apr 2020 13:34:28 +0200 Subject: [runtime.c] Fix deadlock caused by posix implementation of etTimer Bug 562462 Change-Id: Id65ff181656aa1ce2b89db36e8bb617212f9b238 --- .../src/platforms/MT_POSIX_GENERIC_GCC/etLogger.c | 12 ++++++------ .../src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c | 13 ++----------- 2 files changed, 8 insertions(+), 17 deletions(-) (limited to 'runtime/org.eclipse.etrice.runtime.c/src/platforms') diff --git a/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etLogger.c b/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etLogger.c index 42fe4cd82..f4f5b38f2 100644 --- a/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etLogger.c +++ b/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etLogger.c @@ -18,8 +18,8 @@ void etLogger_logError(const char* message){ - fprintf(stderr, "ERROR: %s\n", message); - fflush(stderr); + fprintf(stdout, "ERROR: %s\n", message); + fflush(stdout); } void etLogger_logWarning(const char* message){ @@ -33,13 +33,13 @@ void etLogger_logInfo(const char* message){ } void etLogger_logErrorF(const char* format, ... ){ - fprintf(stderr, "ERROR: "); + fprintf(stdout, "ERROR: "); va_list arglist; va_start( arglist, format ); - vfprintf(stderr, format, arglist ); + vfprintf(stdout, format, arglist ); va_end( arglist ); - fprintf(stderr, "\n"); - fflush(stderr); + fprintf(stdout, "\n"); + fflush(stdout); } void etLogger_logWarningF(const char* format, ... ){ diff --git a/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c b/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c index 4072de8c6..09606b8b0 100644 --- a/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c +++ b/runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c @@ -66,7 +66,6 @@ static void timerThreadFunction(void* data) { while (ET_TRUE) { etTimer* it; int idx; - int signaled = ET_FALSE; #ifdef DEBUG_TIMER printf("timerThreadFunction: waiting\n"); fflush(stdout); @@ -85,14 +84,9 @@ static void timerThreadFunction(void* data) { #endif it->osTimerData.signaled = ET_FALSE; it->timerFunction(it->timerFunctionData); - signaled = ET_TRUE; } } etMutex_leave(&timer_mutex); - - if (!signaled) { - etLogger_logError("timerThreadFunction: signaled timer NOT found\n"); - } } } @@ -100,9 +94,8 @@ static void timerHandler(int sig, siginfo_t *si, void *uc) { etTimer* timer = si->si_value.sival_ptr; int sval = 0; - etMutex_enter(&timer_mutex); + /* Do not acquire the timer mutex in the handler! See signal-safety in linux manual. */ timer->osTimerData.signaled = ET_TRUE; - etMutex_leave(&timer_mutex); sem_getvalue(&(timer_sema.osData), &sval); if (sval==0) @@ -164,8 +157,7 @@ void etTimer_construct(etTimer* self, etTime* timerInterval, etTimerFunction tim self->osTimerData.te.sigev_signo = TIMER_SIGNAL; self->osTimerData.te.sigev_value.sival_ptr = self; if (timer_create(CLOCK_REALTIME, &self->osTimerData.te, &self->osTimerData.timerid) != 0) { - fprintf(stderr, "etTimer_construct: failed creating a timer\n"); - fflush(stderr); + etLogger_logError("etTimer_construct: failed creating a timer"); return; } #ifdef DEBUG_TIMER @@ -207,7 +199,6 @@ void etTimer_start(etTimer* self){ etLogger_logErrorF("etTimer_start: failed starting a timer with errno %d", errno); break; } - fflush(stderr); } } } -- cgit v1.2.1