about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2017-07-10 16:52:10 +0200
committerLeah Neukirchen <leah@vuxu.org>2017-07-10 16:52:10 +0200
commit637d958bd868f35cfac1170354921792bbf91899 (patch)
tree7597420f5d0383732d727c145c9fbe3da846774a
parent8fa2e549cbf181a7552ac8833c1aec56d80c335b (diff)
downloadxe-637d958bd868f35cfac1170354921792bbf91899.tar.gz
xe-637d958bd868f35cfac1170354921792bbf91899.tar.xz
xe-637d958bd868f35cfac1170354921792bbf91899.zip
xe: keep track of our own children
Note that we could have children already upon our execve, there were false
positives before.  Also allows us to spawn our own helper processes now.
-rw-r--r--xe.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/xe.c b/xe.c
index 7e2a468..2b6bf68 100644
--- a/xe.c
+++ b/xe.c
@@ -45,6 +45,8 @@ static size_t argslen;
 static size_t argscap;
 static size_t argsresv;
 
+static pid_t *children;
+
 static char **inargs;
 
 static char *line = 0;
@@ -85,7 +87,17 @@ mywait()
 			return 0;
 		// no other error possible?
 	}	
-	
+
+	int i;
+	for (i = 0; i < maxjobs; i++)
+		if (children[i] == pid) {
+			children[i] = 0;
+			goto my_child;
+		}
+
+	return 1;
+
+my_child:
 	if (WIFEXITED(status)) {
 		if (WEXITSTATUS(status) >= 1 && WEXITSTATUS(status) <= 125) {
 			if (Fflag) {
@@ -193,7 +205,7 @@ run()
 {
 	pid_t pid;
 
-	if (runjobs >= maxjobs)
+	while (runjobs >= maxjobs)
 		mywait();
 	runjobs++;
 	iterations++;
@@ -234,6 +246,13 @@ run()
 		trace();
 	}
 
+	int i;
+	for (i = 0; i < maxjobs; i++)
+		if (!children[i]) {
+			children[i] = pid;
+			break;
+		}
+
 	return 0;
 }
 
@@ -335,6 +354,10 @@ main(int argc, char *argv[], char *envp[])
 			exit(1);
 		}
 
+	children = calloc(sizeof (pid_t), maxjobs);
+	if (!children)
+		exit(1);
+
 	if (aflag || Aflag) {
 		input = 0;
 	} else if (!fflag || strcmp("-", fflag) == 0) {