diff options
Diffstat (limited to 'src/ipcpd/local')
| -rw-r--r-- | src/ipcpd/local/main.c | 12 | 
1 files changed, 8 insertions, 4 deletions
| diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c index f3224de0..b07b0a52 100644 --- a/src/ipcpd/local/main.c +++ b/src/ipcpd/local/main.c @@ -246,20 +246,24 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c)          case SIGHUP:          case SIGQUIT:                  if (info->si_pid == irmd_pid) { +                        bool clean_threads = false;                          LOG_DBG("Terminating by order of %d. Bye.",                                  info->si_pid);                          rw_lock_wrlock(&_ipcp->state_lock); -                        if (_ipcp->state == IPCP_ENROLLED) { -                                pthread_cancel(_ap_instance->sduloop); -                                pthread_join(_ap_instance->sduloop, NULL); -                        } +                        if (_ipcp->state == IPCP_ENROLLED) +                                clean_threads = true;                          _ipcp->state = IPCP_SHUTDOWN;                          rw_lock_unlock(&_ipcp->state_lock); +                        if (clean_threads) { +                                pthread_cancel(_ap_instance->sduloop); +                                pthread_join(_ap_instance->sduloop, NULL); +                        } +                          pthread_cancel(_ap_instance->mainloop);                  }          default: | 
