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