Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Belle2020-04-24 11:34:28 +0000
committerJan Belle2020-04-24 11:34:28 +0000
commit8ed2251ee8df3e5d9ff87d9e0f698fe557fa9729 (patch)
tree49f526520b95816837a259b4d7cafb893a46a956 /runtime/org.eclipse.etrice.runtime.c/src/platforms/MT_POSIX_GENERIC_GCC/etTimer.c
parentee82858c0b96598ac48ad4ef4b9d4ff005264bc9 (diff)
downloadorg.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
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.c13
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);
}
}
}

Back to the top