summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@ugent.be>2017-08-16 12:11:21 +0200
committerdimitri staessens <dimitri.staessens@ugent.be>2017-08-16 12:11:21 +0200
commit6b33850f488ddd23fa29952a8c5d2a7c544617d3 (patch)
tree0ac36f828e5bafc09f2b2d72dbadd3608e7d239e /src/irmd/main.c
parentc8283ea410e7d640537303c6b644bbc3afb35cd5 (diff)
downloadouroboros-6b33850f488ddd23fa29952a8c5d2a7c544617d3.tar.gz
ouroboros-6b33850f488ddd23fa29952a8c5d2a7c544617d3.zip
irmd, ipcpd: Signal acceptor only
This adds an extra condvar so the mainloops can signal the acceptor thread without waking up all mainloops.
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c16
1 files changed, 13 insertions, 3 deletions
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);