diff options
author | Jan Belle | 2020-04-24 11:34:28 +0000 |
---|---|---|
committer | Jan Belle | 2020-04-24 11:34:28 +0000 |
commit | 8ed2251ee8df3e5d9ff87d9e0f698fe557fa9729 (patch) | |
tree | 49f526520b95816837a259b4d7cafb893a46a956 /runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c | |
parent | ee82858c0b96598ac48ad4ef4b9d4ff005264bc9 (diff) | |
download | org.eclipse.etrice-8ed2251ee8df3e5d9ff87d9e0f698fe557fa9729.tar.gz org.eclipse.etrice-8ed2251ee8df3e5d9ff87d9e0f698fe557fa9729.tar.xz org.eclipse.etrice-8ed2251ee8df3e5d9ff87d9e0f698fe557fa9729.zip |
[runtime.c] Fix deadlock caused by posix implementation of etTimer
Bug 562462
Change-Id: Id65ff181656aa1ce2b89db36e8bb617212f9b238
Diffstat (limited to 'runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c')
-rw-r--r-- | runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c | 13 |
1 files changed, 2 insertions, 11 deletions
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); } } } |