diff options
author | dimitri staessens <[email protected]> | 2017-04-04 17:51:22 +0200 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2017-04-04 19:54:26 +0200 |
commit | bf5c0ce8d90613a39df2f6fec79071250b79d1d1 (patch) | |
tree | 1efb856c6ce5dbf2c31448042edde0f5040c05a2 /src/ipcpd/ipcp.c | |
parent | 5ac15427a1a2274dfb678ec569ce1698c6a89c77 (diff) | |
download | ouroboros-bf5c0ce8d90613a39df2f6fec79071250b79d1d1.tar.gz ouroboros-bf5c0ce8d90613a39df2f6fec79071250b79d1d1.zip |
ipcpd, irmd: Fix cleanup of thread resources
Diffstat (limited to 'src/ipcpd/ipcp.c')
-rw-r--r-- | src/ipcpd/ipcp.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index ee5bd76e..fc0e3587 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -522,27 +522,19 @@ int ipcp_init(int argc, return 0; } -static bool is_thread_alive(ssize_t id) -{ - bool ret; - pthread_mutex_lock(&ipcpi.threads_lock); - - ret = bmp_is_id_used(ipcpi.thread_ids, id); - - pthread_mutex_unlock(&ipcpi.threads_lock); - - return ret; -} - void * threadpoolmgr(void * o) { - struct timespec to = {(IPCP_TPM_TIMEOUT / 1000), - (IPCP_TPM_TIMEOUT % 1000) * MILLION}; + pthread_attr_t pattr; struct timespec dl; - size_t t; - + struct timespec to = {(IRMD_TPM_TIMEOUT / 1000), + (IRMD_TPM_TIMEOUT % 1000) * MILLION}; (void) o; + if (pthread_attr_init(&pattr)) + return (void *) -1; + + pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED); + while (true) { clock_gettime(PTHREAD_COND_CLOCK, &dl); ts_add(&dl, &to, &dl); @@ -551,12 +543,13 @@ void * threadpoolmgr(void * o) if (ipcp_get_state() == IPCP_SHUTDOWN || ipcp_get_state() == IPCP_NULL) { pthread_rwlock_unlock(&ipcpi.state_lock); - log_dbg("Threadpool manager exiting."); - for (t = 0; t < IPCP_MAX_THREADS; ++t) - if (is_thread_alive(t)) { - log_dbg("Waiting for thread %zd.", t); - pthread_join(ipcpi.threadpool[t], NULL); - } + pthread_attr_destroy(&pattr); + log_dbg("Waiting for threads to exit."); + pthread_mutex_lock(&ipcpi.threads_lock); + while (ipcpi.threads > 0) + pthread_cond_wait(&ipcpi.threads_cond, + &ipcpi.threads_lock); + pthread_mutex_unlock(&ipcpi.threads_lock); log_dbg("Threadpool manager done."); break; @@ -578,7 +571,7 @@ void * threadpoolmgr(void * o) } if (pthread_create(&ipcpi.threadpool[id], - NULL, ipcp_main_loop, + &pattr, ipcp_main_loop, (void *) id)) log_warn("Failed to start new thread."); else |