From 6f776246133ccd8717ac834b754e9961510b36e9 Mon Sep 17 00:00:00 2001 From: ckolivas Date: Mon, 27 Oct 2014 23:32:09 +1100 Subject: [PATCH] Do not overlap writes to unix sockets --- src/ckpool.c | 8 +++++++- src/ckpool.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ckpool.c b/src/ckpool.c index 8c522d46..0ac0de3a 100644 --- a/src/ckpool.c +++ b/src/ckpool.c @@ -447,21 +447,26 @@ bool _send_proc(proc_instance_t *pi, const char *msg, const char *file, const ch LOGALERT("Attempting to send message %s to non existent process %s", msg, pi->processname); goto out; } + + mutex_lock(&pi->lock); sockd = open_unix_client(path); if (unlikely(sockd < 0)) { LOGWARNING("Failed to open socket %s", path); - goto out; + goto out_unlock; } if (unlikely(!send_unix_msg(sockd, msg))) LOGWARNING("Failed to send %s to socket %s", msg, path); else ret = true; Close(sockd); +out_unlock: + mutex_unlock(&pi->lock); out: if (unlikely(!ret)) { LOGERR("Failure in send_proc from %s %s:%d", file, func, line); childsighandler(15); } + return ret; } @@ -1018,6 +1023,7 @@ static proc_instance_t *prepare_child(ckpool_t *ckp, int (*process)(), char *nam pi->processname = name; pi->sockname = pi->processname; pi->process = process; + mutex_init(&pi->lock); create_process_unixsock(pi); return pi; } diff --git a/src/ckpool.h b/src/ckpool.h index 9284165d..ae15cdfb 100644 --- a/src/ckpool.h +++ b/src/ckpool.h @@ -49,6 +49,7 @@ struct proc_instance { char *sockname; int pid; int (*process)(proc_instance_t *); + pthread_mutex_t lock; }; struct connsock {