# HG changeset patch # User Robert Lehmann # Date 1438094215 -7200 # Node ID 72e9e10644321caf15ce9c755e58120f353e222d # Parent 7740ac6fdedc23e1ed6908d3d7db54833c88572b timers_unix: Fix termination problem of WaitReceiveTaskEnd The function pthread_kill sends the Signal thread and to the own process. If you use this construct than the application which calls uses the canfestival api will terminate at the call of canClose. To avoid that use pthread_cancel instead of pthread_kill. To use the pthread_cancel call you need to set the cancel ability in the thread function. That means you need to call pthread_setcancelstate and pthread_setcanceltype. For the termination of the thread at any time it is important to set the cancel type to PTHREAD_CANCEL_ASYNCHRONOUS. diff -r 7740ac6fdedc -r 72e9e1064432 drivers/timers_unix/timers_unix.c --- a/drivers/timers_unix/timers_unix.c Thu Jun 12 14:07:16 2014 +0200 +++ b/drivers/timers_unix/timers_unix.c Tue Jul 28 16:36:55 2015 +0200 @@ -1,12 +1,12 @@ #include #include -#include +#include #include #include -#include "applicfg.h" -#include "timer.h" +#include +#include static pthread_mutex_t CanFestival_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -104,6 +104,20 @@ // if(signal(SIGTERM, canReceiveLoop_signal) == SIG_ERR) { // perror("signal()"); //} + + // Set the cancelation state for immediatly cancel the task + int ret; + + ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + + if (ret != 0) + perror("Can't enable the cancelation of the receiving task"); + + ret = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + + if (ret != 0) + perror("Can't set the asynchronous cancel typ"); + unixtimer_ReceiveLoop_task_proc((CAN_PORT)port); return NULL; @@ -119,8 +133,8 @@ void WaitReceiveTaskEnd(TASK_HANDLE *Thread) { - if(pthread_kill(*Thread, SIGTERM)) { - perror("pthread_kill()"); + if(pthread_cancel(*Thread)) { + perror("pthread_cancel()"); } if(pthread_join(*Thread, NULL)) { perror("pthread_join()");