Commit f837310e authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

zdtm/fdt_shared: wait until children finish the preparation stage

Reported-by: Mr Jenkins
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent e6e56a62
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <sched.h> #include <sched.h>
#include <signal.h> #include <signal.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <stdlib.h>
#include "zdtmtst.h" #include "zdtmtst.h"
...@@ -19,6 +20,32 @@ TEST_OPTION(filename, string, "file name", 1); ...@@ -19,6 +20,32 @@ TEST_OPTION(filename, string, "file name", 1);
#define TEST_FD 128 #define TEST_FD 128
#define TEST_STRING "Hello World!" #define TEST_STRING "Hello World!"
#define CHILDREN 4
static int fork_pfd[2];
static void forked()
{
char c = 0;
if (write(fork_pfd[1], &c, 1) != 1) {
err("Unable to send a signal to the parent");
exit(5);
}
}
static void wait_children()
{
int i;
char c;
for (i = 0; i < CHILDREN; i++) {
if (read(fork_pfd[0], &c, 1) != 1) {
err("Unable to read a signal from a child");
exit(5);
}
}
}
static pid_t clone_child(int (*fn)(void *), int flags) static pid_t clone_child(int (*fn)(void *), int flags)
{ {
char stack[STACK_SIZE]; char stack[STACK_SIZE];
...@@ -38,6 +65,7 @@ static int child2(void *_arg) ...@@ -38,6 +65,7 @@ static int child2(void *_arg)
{ {
char buf[10]; char buf[10];
forked();
test_waitsig(); test_waitsig();
if (read(TEST_FD, buf, sizeof(TEST_STRING)) != sizeof(TEST_STRING)) { if (read(TEST_FD, buf, sizeof(TEST_STRING)) != sizeof(TEST_STRING)) {
...@@ -50,6 +78,7 @@ static int child2(void *_arg) ...@@ -50,6 +78,7 @@ static int child2(void *_arg)
static int child3(void *_arg) static int child3(void *_arg)
{ {
forked();
test_waitsig(); test_waitsig();
if (close(TEST_FD) != -1) { if (close(TEST_FD) != -1) {
...@@ -74,6 +103,7 @@ static int child(void *_arg) ...@@ -74,6 +103,7 @@ static int child(void *_arg)
if (pid < 0) if (pid < 0)
return 1; return 1;
forked();
test_waitsig(); test_waitsig();
kill(pid2, SIGTERM); kill(pid2, SIGTERM);
...@@ -113,6 +143,11 @@ int main(int argc, char ** argv) ...@@ -113,6 +143,11 @@ int main(int argc, char ** argv)
test_init(argc, argv); test_init(argc, argv);
if (pipe(fork_pfd)) {
err("pipe");
return 1;
}
pid = clone_child(child, CLONE_FILES); pid = clone_child(child, CLONE_FILES);
if (pid < 0) if (pid < 0)
return 1; return 1;
...@@ -121,6 +156,8 @@ int main(int argc, char ** argv) ...@@ -121,6 +156,8 @@ int main(int argc, char ** argv)
if (pid2 < 0) if (pid2 < 0)
return 1; return 1;
wait_children();
test_daemon(); test_daemon();
test_waitsig(); test_waitsig();
......
...@@ -80,7 +80,6 @@ int main(int argc, char **argv) ...@@ -80,7 +80,6 @@ int main(int argc, char **argv)
pid = fork(); pid = fork();
if (pid == 0) { if (pid == 0) {
close(pf[1]);
read(pf[0], &pid, sizeof(pid)); read(pf[0], &pid, sizeof(pid));
exit(0); exit(0);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment