Merge branch 'cb/daemon-reap-children'
Futz with SIGCHLD handling in "git daemon". * cb/daemon-reap-children: daemon: use sigaction() to install child_handler() compat/mingw: allow sigaction(SIGCHLD)
This commit is contained in:
@@ -96,6 +96,7 @@ struct sigaction {
|
|||||||
unsigned sa_flags;
|
unsigned sa_flags;
|
||||||
};
|
};
|
||||||
#define SA_RESTART 0
|
#define SA_RESTART 0
|
||||||
|
#define SA_NOCLDSTOP 1
|
||||||
|
|
||||||
struct itimerval {
|
struct itimerval {
|
||||||
struct timeval it_value, it_interval;
|
struct timeval it_value, it_interval;
|
||||||
|
|||||||
@@ -2561,7 +2561,9 @@ int setitimer(int type UNUSED, struct itimerval *in, struct itimerval *out)
|
|||||||
|
|
||||||
int sigaction(int sig, struct sigaction *in, struct sigaction *out)
|
int sigaction(int sig, struct sigaction *in, struct sigaction *out)
|
||||||
{
|
{
|
||||||
if (sig != SIGALRM)
|
if (sig == SIGCHLD)
|
||||||
|
return -1;
|
||||||
|
else if (sig != SIGALRM)
|
||||||
return errno = EINVAL,
|
return errno = EINVAL,
|
||||||
error("sigaction only implemented for SIGALRM");
|
error("sigaction only implemented for SIGALRM");
|
||||||
if (out)
|
if (out)
|
||||||
|
|||||||
12
daemon.c
12
daemon.c
@@ -915,11 +915,9 @@ static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
|
|||||||
static void child_handler(int signo UNUSED)
|
static void child_handler(int signo UNUSED)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Otherwise empty handler because systemcalls will get interrupted
|
* Otherwise empty handler because systemcalls should get interrupted
|
||||||
* upon signal receipt
|
* upon signal receipt.
|
||||||
* SysV needs the handler to be rearmed
|
|
||||||
*/
|
*/
|
||||||
signal(SIGCHLD, child_handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_reuse_addr(int sockfd)
|
static int set_reuse_addr(int sockfd)
|
||||||
@@ -1115,6 +1113,7 @@ static void socksetup(struct string_list *listen_addr, int listen_port, struct s
|
|||||||
|
|
||||||
static int service_loop(struct socketlist *socklist)
|
static int service_loop(struct socketlist *socklist)
|
||||||
{
|
{
|
||||||
|
struct sigaction sa;
|
||||||
struct pollfd *pfd;
|
struct pollfd *pfd;
|
||||||
|
|
||||||
CALLOC_ARRAY(pfd, socklist->nr);
|
CALLOC_ARRAY(pfd, socklist->nr);
|
||||||
@@ -1124,7 +1123,10 @@ static int service_loop(struct socketlist *socklist)
|
|||||||
pfd[i].events = POLLIN;
|
pfd[i].events = POLLIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGCHLD, child_handler);
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sa.sa_flags = SA_NOCLDSTOP;
|
||||||
|
sa.sa_handler = child_handler;
|
||||||
|
sigaction(SIGCHLD, &sa, NULL);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
check_dead_children();
|
check_dead_children();
|
||||||
|
|||||||
Reference in New Issue
Block a user