Git fork

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)

+11 -6
+1
compat/mingw-posix.h
··· 96 96 unsigned sa_flags; 97 97 }; 98 98 #define SA_RESTART 0 99 + #define SA_NOCLDSTOP 1 99 100 100 101 struct itimerval { 101 102 struct timeval it_value, it_interval;
+3 -1
compat/mingw.c
··· 2561 2561 2562 2562 int sigaction(int sig, struct sigaction *in, struct sigaction *out) 2563 2563 { 2564 - if (sig != SIGALRM) 2564 + if (sig == SIGCHLD) 2565 + return -1; 2566 + else if (sig != SIGALRM) 2565 2567 return errno = EINVAL, 2566 2568 error("sigaction only implemented for SIGALRM"); 2567 2569 if (out)
+7 -5
daemon.c
··· 915 915 static void child_handler(int signo UNUSED) 916 916 { 917 917 /* 918 - * Otherwise empty handler because systemcalls will get interrupted 919 - * upon signal receipt 920 - * SysV needs the handler to be rearmed 918 + * Otherwise empty handler because systemcalls should get interrupted 919 + * upon signal receipt. 921 920 */ 922 - signal(SIGCHLD, child_handler); 923 921 } 924 922 925 923 static int set_reuse_addr(int sockfd) ··· 1115 1113 1116 1114 static int service_loop(struct socketlist *socklist) 1117 1115 { 1116 + struct sigaction sa; 1118 1117 struct pollfd *pfd; 1119 1118 1120 1119 CALLOC_ARRAY(pfd, socklist->nr); ··· 1124 1123 pfd[i].events = POLLIN; 1125 1124 } 1126 1125 1127 - signal(SIGCHLD, child_handler); 1126 + sigemptyset(&sa.sa_mask); 1127 + sa.sa_flags = SA_NOCLDSTOP; 1128 + sa.sa_handler = child_handler; 1129 + sigaction(SIGCHLD, &sa, NULL); 1128 1130 1129 1131 for (;;) { 1130 1132 check_dead_children();