summaryrefslogtreecommitdiff
path: root/src/ipcpd/ipcp.c
diff options
context:
space:
mode:
authordimitri staessens <[email protected]>2017-04-04 17:51:22 +0200
committerdimitri staessens <[email protected]>2017-04-04 19:54:26 +0200
commitbf5c0ce8d90613a39df2f6fec79071250b79d1d1 (patch)
tree1efb856c6ce5dbf2c31448042edde0f5040c05a2 /src/ipcpd/ipcp.c
parent5ac15427a1a2274dfb678ec569ce1698c6a89c77 (diff)
downloadouroboros-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.c39
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