+#ifdef LISP_FEATURE_SB_THREAD
+int show_thread_exit=0;
+
+static void /* noreturn */ parent_loop(void)
+{
+ struct sigaction sa;
+ sigset_t sigset;
+ int status;
+ pid_t pid=0;
+
+ sigemptyset(&sigset);
+
+ sigaddset(&sigset, SIGALRM);
+ sigaddset(&sigset, SIGCHLD);
+ sigprocmask(SIG_UNBLOCK,&sigset,0);
+ sa.sa_handler=parent_sighandler;
+ sa.sa_mask=sigset;
+ sa.sa_flags=SA_SIGINFO;
+ sigaction(SIGALRM, &sa, 0);
+ sigaction(SIGCHLD, &sa, 0);
+
+ sigemptyset(&sigset);
+ sa.sa_handler=SIG_IGN;
+ sa.sa_mask=sigset;
+ sa.sa_flags=0;
+ sigaction(SIGINT, &sa, 0);
+
+ while(!all_threads) {
+ sched_yield();
+ }
+ while(all_threads && (pid=waitpid(-1,&status,__WALL))) {
+ struct thread *th;
+ int real_errno=errno;
+ if(pid==-1) {
+ if(real_errno == EINTR) {
+ continue;
+ }
+ if(real_errno == ECHILD) break;
+ fprintf(stderr,"waitpid: %s\n",strerror(real_errno));
+ continue;
+ }
+ if(WIFEXITED(status) || WIFSIGNALED(status)) {
+ th=find_thread_by_pid(pid);
+ if(!th) continue;
+ if(show_thread_exit)
+ fprintf(stderr,"waitpid : child %d %x exited \n", pid,th);
+ destroy_thread(th);
+ if(!all_threads) break;
+ }
+ }
+ exit(WEXITSTATUS(status));
+}
+
+#endif