svn commit: trunk/busybox: archival include init ipsvd libbb miscut etc...

vda at busybox.net vda at busybox.net
Wed Jan 2 19:55:12 UTC 2008


Author: vda
Date: 2008-01-02 11:55:04 -0800 (Wed, 02 Jan 2008)
New Revision: 20697

Log:
libbb: introduce and use safe_waitpid (loops in EINTR)
*: use more approproate (shorter) versions of wait()

function                                             old     new   delta
safe_waitpid                                           -      48     +48
wait_any_nohang                                        -      17     +17
send_tree                                            365     369      +4
processorstop                                        432     435      +3
text_yank                                            110     108      -2
make_human_readable_str                              202     200      -2
crond_main                                          1368    1366      -2
handle_sigchld                                        49      43      -6
reapchild                                            166     159      -7
custom                                               260     250     -10
checkscript                                          191     177     -14
wait_nohang                                           17       -     -17
wait_pid                                              43       -     -43
------------------------------------------------------------------------------
(add/remove: 2/2 grow/shrink: 2/7 up/down: 72/-103)           Total: -31 bytes



Modified:
   trunk/busybox/archival/tar.c
   trunk/busybox/include/libbb.h
   trunk/busybox/init/init.c
   trunk/busybox/ipsvd/tcpudp.c
   trunk/busybox/libbb/vfork_daemon_rexec.c
   trunk/busybox/miscutils/crond.c
   trunk/busybox/networking/httpd.c
   trunk/busybox/networking/ifupdown.c
   trunk/busybox/networking/inetd.c
   trunk/busybox/networking/telnetd.c
   trunk/busybox/networking/udhcp/script.c
   trunk/busybox/runit/runsv.c
   trunk/busybox/runit/runsvdir.c
   trunk/busybox/runit/sv.c
   trunk/busybox/runit/svlogd.c
   trunk/busybox/shell/ash.c
   trunk/busybox/shell/hush.c
   trunk/busybox/shell/msh.c


Changeset:
Modified: trunk/busybox/archival/tar.c
===================================================================
--- trunk/busybox/archival/tar.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/archival/tar.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -610,7 +610,7 @@
 
 	if (gzipPid) {
 		int status;
-		if (waitpid(gzipPid, &status, 0) == -1)
+		if (safe_waitpid(gzipPid, &status, 0) == -1)
 			bb_perror_msg("waitpid");
 		else if (!WIFEXITED(status) || WEXITSTATUS(status))
 			/* gzip was killed or has exited with nonzero! */
@@ -688,7 +688,7 @@
 	/* Actually, 'status' is a signo. We reuse it for other needs */
 
 	/* Wait for any child without blocking */
-	if (waitpid(-1, &status, WNOHANG) < 0)
+	if (wait_any_nohang(&status) < 0)
 		/* wait failed?! I'm confused... */
 		return;
 

Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/include/libbb.h	2008-01-02 19:55:04 UTC (rev 20697)
@@ -587,9 +587,9 @@
  *      if (rc < 0) bb_perror_msg("%s", argv[0]);
  *      if (rc > 0) bb_error_msg("exit code: %d", rc);
  */
+int safe_waitpid(int pid, int *wstat, int options);
 int wait4pid(int pid);
-int wait_pid(int *wstat, int pid);
-int wait_nohang(int *wstat);
+int wait_any_nohang(int *wstat);
 #define wait_crashed(w) ((w) & 127)
 #define wait_exitcode(w) ((w) >> 8)
 #define wait_stopsig(w) ((w) >> 8)

Modified: trunk/busybox/init/init.c
===================================================================
--- trunk/busybox/init/init.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/init/init.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -95,9 +95,14 @@
 
 /* Function prototypes */
 static void delete_init_action(struct init_action *a);
-static int waitfor(pid_t pid);
 static void halt_reboot_pwoff(int sig) ATTRIBUTE_NORETURN;
 
+/* TODO: move to libbb? */
+static int waitfor(pid_t runpid)
+{
+	return safe_waitpid(runpid, NULL, 0);
+}
+
 static void loop_forever(void) ATTRIBUTE_NORETURN;
 static void loop_forever(void)
 {
@@ -465,19 +470,6 @@
 	_exit(-1);
 }
 
-static int waitfor(pid_t runpid)
-{
-	int status, wpid;
-
-	while (1) {
-		wpid = waitpid(runpid, &status, 0);
-		if (wpid == -1 && errno == EINTR)
-			continue;
-		break;
-	}
-	return wpid;
-}
-
 /* Run all commands of a particular type */
 static void run_actions(int action)
 {
@@ -520,7 +512,7 @@
 		reboot(magic);
 		_exit(0);
 	}
-	waitpid(pid, NULL, 0);
+	waitfor(pid);
 }
 
 static void kill_all_processes(void)
@@ -980,7 +972,7 @@
 		/* Don't consume all CPU time -- sleep a bit */
 		sleep(1);
 
-		/* Wait for a child process to exit */
+		/* Wait for any child process to exit */
 		wpid = wait(NULL);
 		while (wpid > 0) {
 			/* Find out who died and clean up their corpse */
@@ -995,7 +987,7 @@
 				}
 			}
 			/* see if anyone else is waiting to be reaped */
-			wpid = waitpid(-1, NULL, WNOHANG);
+			wpid = wait_any_nohang(NULL);
 		}
 	}
 }

Modified: trunk/busybox/ipsvd/tcpudp.c
===================================================================
--- trunk/busybox/ipsvd/tcpudp.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/ipsvd/tcpudp.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -121,7 +121,7 @@
 	int wstat;
 	int pid;
 
-	while ((pid = wait_nohang(&wstat)) > 0) {
+	while ((pid = wait_any_nohang(&wstat)) > 0) {
 		if (max_per_host)
 			ipsvd_perhost_remove(pid);
 		if (cnum)

Modified: trunk/busybox/libbb/vfork_daemon_rexec.c
===================================================================
--- trunk/busybox/libbb/vfork_daemon_rexec.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/libbb/vfork_daemon_rexec.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -66,6 +66,21 @@
 	return pid;
 }
 
+int safe_waitpid(int pid, int *wstat, int options)
+{
+	int r;
+
+	do
+		r = waitpid(pid, wstat, options);
+	while ((r == -1) && (errno == EINTR));
+	return r;
+}
+
+int wait_any_nohang(int *wstat)
+{
+	return safe_waitpid(-1, wstat, WNOHANG);
+}
+
 // Wait for the specified child PID to exit, returning child's error return.
 int wait4pid(int pid)
 {
@@ -76,30 +91,20 @@
 		/* we expect errno to be already set from failed [v]fork/exec */
 		return -1;
 	}
-	if (waitpid(pid, &status, 0) == -1)
+	if (safe_waitpid(pid, &status, 0) == -1)
 		return -1;
 	if (WIFEXITED(status))
 		return WEXITSTATUS(status);
 	if (WIFSIGNALED(status))
 		return WTERMSIG(status) + 1000;
 	return 0;
+	if (WIFEXITED(status))
+		return WEXITSTATUS(status);
+	if (WIFSIGNALED(status))
+		return WTERMSIG(status) + 1000;
+	return 0;
 }
 
-int wait_nohang(int *wstat)
-{
-	return waitpid(-1, wstat, WNOHANG);
-}
-
-int wait_pid(int *wstat, int pid)
-{
-	int r;
-
-	do
-		r = waitpid(pid, wstat, 0);
-	while ((r == -1) && (errno == EINTR));
-	return r;
-}
-
 #if ENABLE_FEATURE_PREFER_APPLETS
 void save_nofork_data(struct nofork_save_area *save)
 {

Modified: trunk/busybox/miscutils/crond.c
===================================================================
--- trunk/busybox/miscutils/crond.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/miscutils/crond.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -756,7 +756,7 @@
 			for (line = file->cf_LineBase; line; line = line->cl_Next) {
 				if (line->cl_Pid > 0) {
 					int status;
-					int r = wait4(line->cl_Pid, &status, WNOHANG, NULL);
+					int r = waitpid(line->cl_Pid, &status, WNOHANG);
 
 					if (r < 0 || r == line->cl_Pid) {
 						EndJob(file->cf_User, line);

Modified: trunk/busybox/networking/httpd.c
===================================================================
--- trunk/busybox/networking/httpd.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/networking/httpd.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -1152,7 +1152,7 @@
 		count = safe_poll(pfd, 3, -1);
 		if (count <= 0) {
 #if 0
-			if (waitpid(pid, &status, WNOHANG) <= 0) {
+			if (safe_waitpid(pid, &status, WNOHANG) <= 0) {
 				/* Weird. CGI didn't exit and no fd's
 				 * are ready, yet poll returned?! */
 				continue;

Modified: trunk/busybox/networking/ifupdown.c
===================================================================
--- trunk/busybox/networking/ifupdown.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/networking/ifupdown.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -944,7 +944,7 @@
 			execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, NULL, my_environ);
 			exit(127);
 		}
-		waitpid(child, &status, 0);
+		safe_waitpid(child, &status, 0);
 		if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
 			return 0;
 		}
@@ -1068,7 +1068,7 @@
 		fprintf(in, "%s\n", map->mapping[i]);
 	}
 	fclose(in);
-	waitpid(pid, &status, 0);
+	safe_waitpid(pid, &status, 0);
 
 	if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
 		/* If the mapping script exited successfully, try to

Modified: trunk/busybox/networking/inetd.c
===================================================================
--- trunk/busybox/networking/inetd.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/networking/inetd.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -1161,7 +1161,7 @@
 	servtab_t *sep;
 
 	for (;;) {
-		pid = wait3(&status, WNOHANG, NULL);
+		pid = wait_any_nohang(&status);
 		if (pid <= 0)
 			break;
 		for (sep = servtab; sep; sep = sep->se_next)

Modified: trunk/busybox/networking/telnetd.c
===================================================================
--- trunk/busybox/networking/telnetd.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/networking/telnetd.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -394,7 +394,7 @@
 
 	/* Looping: more than one child may have exited */
 	while (1) {
-		pid = waitpid(-1, NULL, WNOHANG);
+		pid = wait_any_nohang(NULL);
 		if (pid <= 0)
 			break;
 		ts = sessions;

Modified: trunk/busybox/networking/udhcp/script.c
===================================================================
--- trunk/busybox/networking/udhcp/script.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/networking/udhcp/script.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -232,7 +232,7 @@
 		       name, NULL, envp);
 		bb_perror_msg_and_die("script %s failed", client_config.script);
 	}
-	waitpid(pid, NULL, 0);
+	safe_waitpid(pid, NULL, 0);
 	for (curr = envp; *curr; curr++)
 		free(*curr);
 	free(envp);

Modified: trunk/busybox/runit/runsv.c
===================================================================
--- trunk/busybox/runit/runsv.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/runit/runsv.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -282,8 +282,7 @@
 				execve(a, prog, environ);
 				fatal_cannot("run control/?");
 			}
-			while (wait_pid(&w, pid) == -1) {
-				if (errno == EINTR) continue;
+			while (safe_waitpid(pid, &w, 0) == -1) {
 				warn_cannot("wait for child control/?");
 				return 0;
 			}
@@ -593,7 +592,7 @@
 			int child;
 			int wstat;
 
-			child = wait_nohang(&wstat);
+			child = wait_any_nohang(&wstat);
 			if (!child)
 				break;
 			if ((child == -1) && (errno != EINTR))

Modified: trunk/busybox/runit/runsvdir.c
===================================================================
--- trunk/busybox/runit/runsvdir.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/runit/runsvdir.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -252,7 +252,7 @@
 	for (;;) {
 		/* collect children */
 		for (;;) {
-			pid = wait_nohang(&wstat);
+			pid = wait_any_nohang(&wstat);
 			if (pid <= 0)
 				break;
 			for (i = 0; i < svnum; i++) {

Modified: trunk/busybox/runit/sv.c
===================================================================
--- trunk/busybox/runit/sv.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/runit/sv.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -333,8 +333,7 @@
 		bb_perror_msg(WARN"cannot %s child %s/check", "run", *service);
 		return 0;
 	}
-	while (wait_pid(&w, pid) == -1) {
-		if (errno == EINTR) continue;
+	while (safe_waitpid(pid, &w, 0) == -1) {
 		bb_perror_msg(WARN"cannot %s child %s/check", "wait for", *service);
 		return 0;
 	}

Modified: trunk/busybox/runit/svlogd.c
===================================================================
--- trunk/busybox/runit/svlogd.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/runit/svlogd.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -265,7 +265,7 @@
 
 	if (ld->ppid) {
 		sig_unblock(SIGHUP);
-		while (wait_pid(&wstat, ld->ppid) == -1)
+		while (safe_waitpid(ld->ppid, &wstat, 0) == -1)
 			pause2cannot("wait for processor", ld->name);
 		sig_block(SIGHUP);
 		ld->ppid = 0;
@@ -794,7 +794,7 @@
 
 	if (verbose)
 		bb_error_msg(INFO"sig%s received", "child");
-	while ((pid = wait_nohang(&wstat)) > 0) {
+	while ((pid = wait_any_nohang(&wstat)) > 0) {
 		for (l = 0; l < dirn; ++l) {
 			if (dir[l].ppid == pid) {
 				dir[l].ppid = 0;

Modified: trunk/busybox/shell/ash.c
===================================================================
--- trunk/busybox/shell/ash.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/shell/ash.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -3768,7 +3768,7 @@
 #endif
 	if (block == 0)
 		flags |= WNOHANG;
-	return wait3(status, flags, (struct rusage *)NULL);
+	return waitpid(-1, status, flags); // safe_waitpid?
 }
 
 /*

Modified: trunk/busybox/shell/hush.c
===================================================================
--- trunk/busybox/shell/hush.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/shell/hush.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -1649,6 +1649,7 @@
 // + killall -STOP cat
 
  wait_more:
+// TODO: safe_waitpid?
 	while ((childpid = waitpid(-1, &status, attributes)) > 0) {
 		const int dead = WIFEXITED(status) || WIFSIGNALED(status);
 

Modified: trunk/busybox/shell/msh.c
===================================================================
--- trunk/busybox/shell/msh.c	2007-12-30 20:13:39 UTC (rev 20696)
+++ trunk/busybox/shell/msh.c	2008-01-02 19:55:04 UTC (rev 20697)
@@ -4162,7 +4162,7 @@
 		return 0;
 	}
 	if (i != 0) {
-		waitpid(i, NULL, 0);
+		waitpid(i, NULL, 0); // safe_waitpid?
 		global_env.iop->argp->aword = ++cp;
 		close(pf[1]);
 		PUSHIO(afile, remap(pf[0]),




More information about the busybox-cvs mailing list