From 6b33850f488ddd23fa29952a8c5d2a7c544617d3 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Wed, 16 Aug 2017 12:11:21 +0200 Subject: irmd, ipcpd: Signal acceptor only This adds an extra condvar so the mainloops can signal the acceptor thread without waking up all mainloops. --- src/ipcpd/ipcp.c | 12 ++++++++++-- src/ipcpd/ipcp.h | 1 + src/irmd/main.c | 16 +++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index c5769f9e..7066fb04 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -138,7 +138,7 @@ static void * acceptloop(void * o) pthread_cond_signal(&ipcpi.cmd_cond); while (ipcpi.csockfd != -1) - pthread_cond_wait(&ipcpi.cmd_cond, &ipcpi.cmd_lock); + pthread_cond_wait(&ipcpi.acc_cond, &ipcpi.cmd_lock); pthread_mutex_unlock(&ipcpi.cmd_lock); } @@ -189,7 +189,7 @@ static void * mainloop(void * o) continue; } - pthread_cond_broadcast(&ipcpi.cmd_cond); + pthread_cond_signal(&ipcpi.acc_cond); msg = ipcp_msg__unpack(NULL, ipcpi.cmd_len, ipcpi.cbuf); if (msg == NULL) { @@ -591,6 +591,11 @@ int ipcp_init(int argc, goto fail_cmd_cond; } + if (pthread_cond_init(&ipcpi.acc_cond, &cattr)) { + log_err("Failed to init convar."); + goto fail_acc_cond; + } + ipcpi.alloc_id = -1; ipcpi.csockfd = -1; @@ -607,6 +612,8 @@ int ipcp_init(int argc, return 0; fail_shim_data: + pthread_cond_destroy(&ipcpi.acc_cond); + fail_acc_cond: pthread_cond_destroy(&ipcpi.cmd_cond); fail_cmd_cond: pthread_mutex_destroy(&ipcpi.cmd_lock); @@ -702,6 +709,7 @@ void ipcp_fini() pthread_mutex_destroy(&ipcpi.state_mtx); pthread_cond_destroy(&ipcpi.alloc_cond); pthread_mutex_destroy(&ipcpi.alloc_lock); + pthread_cond_destroy(&ipcpi.acc_cond); pthread_cond_destroy(&ipcpi.cmd_cond); pthread_mutex_destroy(&ipcpi.cmd_lock); diff --git a/src/ipcpd/ipcp.h b/src/ipcpd/ipcp.h index d2ad7cde..422670d7 100644 --- a/src/ipcpd/ipcp.h +++ b/src/ipcpd/ipcp.h @@ -93,6 +93,7 @@ struct ipcp { uint8_t cbuf[IPCP_MSG_BUF_SIZE]; size_t cmd_len; int csockfd; + pthread_cond_t acc_cond; pthread_cond_t cmd_cond; pthread_mutex_t cmd_lock; diff --git a/src/irmd/main.c b/src/irmd/main.c index a316b3cf..61ce6a49 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -101,6 +101,7 @@ struct { uint8_t cbuf[IB_LEN]; /* cmd message buffer */ size_t cmd_len; /* length of cmd in cbuf */ int csockfd; /* cmd UNIX socket */ + pthread_cond_t acc_cond; /* cmd accepted condvar */ pthread_cond_t cmd_cond; /* cmd signal condvar */ pthread_mutex_t cmd_lock; /* cmd signal lock */ @@ -1476,6 +1477,7 @@ static void irm_fini(void) lockfile_destroy(irmd.lf); pthread_mutex_destroy(&irmd.cmd_lock); + pthread_cond_destroy(&irmd.acc_cond); pthread_cond_destroy(&irmd.cmd_cond); pthread_rwlock_destroy(&irmd.reg_lock); pthread_rwlock_destroy(&irmd.state_lock); @@ -1737,7 +1739,7 @@ static void * acceptloop(void * o) pthread_cond_signal(&irmd.cmd_cond); while(irmd.csockfd != -1) - pthread_cond_wait(&irmd.cmd_cond, &irmd.cmd_lock); + pthread_cond_wait(&irmd.acc_cond, &irmd.cmd_lock); pthread_mutex_unlock(&irmd.cmd_lock); } @@ -1762,7 +1764,7 @@ void * mainloop(void * o) struct irm_flow * e = NULL; pid_t * apis = NULL; struct timespec * timeo = NULL; - struct timespec ts = {0,0}; + struct timespec ts = {0, 0}; ret_msg.code = IRM_MSG_CODE__IRM_REPLY; @@ -1788,7 +1790,7 @@ void * mainloop(void * o) continue; } - pthread_cond_broadcast(&irmd.cmd_cond); + pthread_cond_signal(&irmd.acc_cond); msg = irm_msg__unpack(NULL, irmd.cmd_len, irmd.cbuf); if (msg == NULL) { @@ -2013,6 +2015,12 @@ static int irm_init(void) goto fail_cmd_cond; } + if (pthread_cond_init(&irmd.acc_cond, &cattr)) { + log_err("Failed to initialize condvar."); + pthread_condattr_destroy(&cattr); + goto fail_acc_cond; + } + pthread_condattr_destroy(&cattr); list_head_init(&irmd.ipcps); @@ -2100,6 +2108,8 @@ static int irm_init(void) fail_lockfile: bmp_destroy(irmd.port_ids); fail_port_ids: + pthread_cond_destroy(&irmd.acc_cond); + fail_acc_cond: pthread_cond_destroy(&irmd.cmd_cond); fail_cmd_cond: pthread_mutex_destroy(&irmd.cmd_lock); -- cgit v1.2.3