MINOR: threads/checks: Add a lock to protect the pid list used by external checks

This commit is contained in:
Christopher Faulet 2017-10-20 15:40:23 +02:00 committed by Willy Tarreau
parent 6251902e67
commit cfda847643
2 changed files with 18 additions and 2 deletions

View File

@ -169,6 +169,7 @@ enum lock_label {
NOTIF_LOCK, NOTIF_LOCK,
SPOE_APPLET_LOCK, SPOE_APPLET_LOCK,
DNS_LOCK, DNS_LOCK,
PID_LIST_LOCK,
LOCK_LABELS LOCK_LABELS
}; };
struct lock_stat { struct lock_stat {
@ -257,7 +258,7 @@ static inline void show_lock_stats()
"UPDATED_SERVERS", "LBPRM", "SIGNALS", "STK_TABLE", "STK_SESS", "UPDATED_SERVERS", "LBPRM", "SIGNALS", "STK_TABLE", "STK_SESS",
"APPLETS", "PEER", "BUF_WQ", "STREAMS", "SSL", "SSL_GEN_CERTS", "APPLETS", "PEER", "BUF_WQ", "STREAMS", "SSL", "SSL_GEN_CERTS",
"PATREF", "PATEXP", "PATLRU", "VARS", "COMP_POOL", "LUA", "PATREF", "PATEXP", "PATLRU", "VARS", "COMP_POOL", "LUA",
"NOTIF", "SPOE_APPLET", "DNS" }; "NOTIF", "SPOE_APPLET", "DNS", "PID_LIST" };
int lbl; int lbl;
for (lbl = 0; lbl < LOCK_LABELS; lbl++) { for (lbl = 0; lbl < LOCK_LABELS; lbl++) {

View File

@ -35,6 +35,7 @@
#include <common/mini-clist.h> #include <common/mini-clist.h>
#include <common/standard.h> #include <common/standard.h>
#include <common/time.h> #include <common/time.h>
#include <common/hathreads.h>
#include <types/global.h> #include <types/global.h>
#include <types/dns.h> #include <types/dns.h>
@ -1582,6 +1583,9 @@ static int connect_conn_chk(struct task *t)
static struct list pid_list = LIST_HEAD_INIT(pid_list); static struct list pid_list = LIST_HEAD_INIT(pid_list);
static struct pool_head *pool2_pid_list; static struct pool_head *pool2_pid_list;
#ifdef USE_THREAD
HA_SPINLOCK_T pid_list_lock;
#endif
void block_sigchld(void) void block_sigchld(void)
{ {
@ -1612,7 +1616,11 @@ static struct pid_list *pid_list_add(pid_t pid, struct task *t)
elem->exited = 0; elem->exited = 0;
check->curpid = elem; check->curpid = elem;
LIST_INIT(&elem->list); LIST_INIT(&elem->list);
SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
LIST_ADD(&pid_list, &elem->list); LIST_ADD(&pid_list, &elem->list);
SPIN_UNLOCK(PID_LIST_LOCK, &pid_list_lock);
return elem; return elem;
} }
@ -1623,7 +1631,10 @@ static void pid_list_del(struct pid_list *elem)
if (!elem) if (!elem)
return; return;
SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
LIST_DEL(&elem->list); LIST_DEL(&elem->list);
SPIN_UNLOCK(PID_LIST_LOCK, &pid_list_lock);
if (!elem->exited) if (!elem->exited)
kill(elem->pid, SIGTERM); kill(elem->pid, SIGTERM);
@ -1637,15 +1648,17 @@ static void pid_list_expire(pid_t pid, int status)
{ {
struct pid_list *elem; struct pid_list *elem;
SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
list_for_each_entry(elem, &pid_list, list) { list_for_each_entry(elem, &pid_list, list) {
if (elem->pid == pid) { if (elem->pid == pid) {
elem->t->expire = now_ms; elem->t->expire = now_ms;
elem->status = status; elem->status = status;
elem->exited = 1; elem->exited = 1;
task_wakeup(elem->t, TASK_WOKEN_IO); task_wakeup(elem->t, TASK_WOKEN_IO);
return; break;
} }
} }
SPIN_UNLOCK(PID_LIST_LOCK, &pid_list_lock);
} }
static void sigchld_handler(struct sig_handler *sh) static void sigchld_handler(struct sig_handler *sh)
@ -1676,6 +1689,8 @@ static int init_pid_list(void)
return 1; return 1;
} }
SPIN_INIT(&pid_list_lock);
return 0; return 0;
} }