NOTIF_LOCK,
SPOE_APPLET_LOCK,
DNS_LOCK,
+ PID_LIST_LOCK,
LOCK_LABELS
};
struct lock_stat {
"UPDATED_SERVERS", "LBPRM", "SIGNALS", "STK_TABLE", "STK_SESS",
"APPLETS", "PEER", "BUF_WQ", "STREAMS", "SSL", "SSL_GEN_CERTS",
"PATREF", "PATEXP", "PATLRU", "VARS", "COMP_POOL", "LUA",
- "NOTIF", "SPOE_APPLET", "DNS" };
+ "NOTIF", "SPOE_APPLET", "DNS", "PID_LIST" };
int lbl;
for (lbl = 0; lbl < LOCK_LABELS; lbl++) {
#include <common/mini-clist.h>
#include <common/standard.h>
#include <common/time.h>
+#include <common/hathreads.h>
#include <types/global.h>
#include <types/dns.h>
static struct list pid_list = LIST_HEAD_INIT(pid_list);
static struct pool_head *pool2_pid_list;
+#ifdef USE_THREAD
+HA_SPINLOCK_T pid_list_lock;
+#endif
void block_sigchld(void)
{
elem->exited = 0;
check->curpid = elem;
LIST_INIT(&elem->list);
+
+ SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
LIST_ADD(&pid_list, &elem->list);
+ SPIN_UNLOCK(PID_LIST_LOCK, &pid_list_lock);
+
return elem;
}
if (!elem)
return;
+ SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
LIST_DEL(&elem->list);
+ SPIN_UNLOCK(PID_LIST_LOCK, &pid_list_lock);
+
if (!elem->exited)
kill(elem->pid, SIGTERM);
{
struct pid_list *elem;
+ SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
list_for_each_entry(elem, &pid_list, list) {
if (elem->pid == pid) {
elem->t->expire = now_ms;
elem->status = status;
elem->exited = 1;
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)
return 1;
}
+ SPIN_INIT(&pid_list_lock);
+
return 0;
}