aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/gnunet_mpi_test.c
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2012-12-08 13:05:37 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2012-12-08 13:05:37 +0000
commitf07a214d96d23a755b33219c8d96145a6aa62e2a (patch)
treecd207dd41ea9ab4e54a234a0be639d5337f68142 /src/testbed/gnunet_mpi_test.c
parent3b44ddf34ee8b813c3dc14ce5c73fd789803ad14 (diff)
downloadgnunet-f07a214d96d23a755b33219c8d96145a6aa62e2a.tar.gz
gnunet-f07a214d96d23a755b33219c8d96145a6aa62e2a.zip
- replacing fork with exec
Diffstat (limited to 'src/testbed/gnunet_mpi_test.c')
-rw-r--r--src/testbed/gnunet_mpi_test.c76
1 files changed, 37 insertions, 39 deletions
diff --git a/src/testbed/gnunet_mpi_test.c b/src/testbed/gnunet_mpi_test.c
index 1e1608228..85049abc2 100644
--- a/src/testbed/gnunet_mpi_test.c
+++ b/src/testbed/gnunet_mpi_test.c
@@ -12,8 +12,10 @@ int main (int argc, char *argv[])
12{ 12{
13 char *msg; 13 char *msg;
14 char *filename; 14 char *filename;
15 struct GNUNET_OS_Process *proc;
16 unsigned long code;
15 pid_t pid; 17 pid_t pid;
16 pid_t ppid; 18 enum GNUNET_OS_ProcessStatusType proc_status;
17 int ntasks; 19 int ntasks;
18 int rank; 20 int rank;
19 int msg_size; 21 int msg_size;
@@ -21,11 +23,20 @@ int main (int argc, char *argv[])
21 23
22 ret = GNUNET_SYSERR; 24 ret = GNUNET_SYSERR;
23 if (MPI_SUCCESS != MPI_Init (&argc, &argv)) 25 if (MPI_SUCCESS != MPI_Init (&argc, &argv))
26 {
27 GNUNET_break (0);
24 return 1; 28 return 1;
29 }
25 if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks)) 30 if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks))
31 {
32 GNUNET_break (0);
26 goto finalize; 33 goto finalize;
34 }
27 if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank)) 35 if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank))
36 {
37 GNUNET_break (0);
28 goto finalize; 38 goto finalize;
39 }
29 pid = getpid(); 40 pid = getpid();
30 (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank); 41 (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank);
31 msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank); 42 msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank);
@@ -40,57 +51,44 @@ int main (int argc, char *argv[])
40 GNUNET_free (filename); 51 GNUNET_free (filename);
41 GNUNET_free (msg); 52 GNUNET_free (msg);
42 if (GNUNET_OK != ret) 53 if (GNUNET_OK != ret)
54 {
55 GNUNET_break (0);
43 goto finalize; 56 goto finalize;
57 }
44 58
45 ret = GNUNET_SYSERR; 59 ret = GNUNET_SYSERR;
46 ppid = pid; 60 proc = GNUNET_OS_start_process (GNUNET_NO,
47 pid = fork (); 61 GNUNET_OS_INHERIT_STD_ALL,
48 if (-1 == pid) 62 NULL,
63 NULL,
64 "uptime", NULL);
65 if (NULL == proc)
49 { 66 {
50 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork"); 67 printf ("Cannot exec\n");
51 goto finalize; 68 goto finalize;
52 } 69 }
53 if (0 == pid) 70 do {
71 (void) sleep (1);
72 ret = GNUNET_OS_process_status (proc, &proc_status, &code);
73 } while (GNUNET_NO == ret);
74 GNUNET_assert (GNUNET_NO != ret);
75 if (GNUNET_OK == ret)
54 { 76 {
55 /* child code */ 77 if (0 != code)
56 pid = getpid ();
57 (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank);
58 msg_size = GNUNET_asprintf (&msg, "Child of %d\n", (int) ppid);
59 printf ("%s", msg);
60 if (msg_size == GNUNET_DISK_fn_write (filename,
61 msg, msg_size,
62 GNUNET_DISK_PERM_USER_READ
63 | GNUNET_DISK_PERM_GROUP_READ
64 | GNUNET_DISK_PERM_USER_WRITE
65 | GNUNET_DISK_PERM_GROUP_WRITE))
66 ret = GNUNET_OK;
67 GNUNET_free (filename);
68 GNUNET_free (msg);
69 return (GNUNET_OK == ret) ? 0 : 1;
70 }
71 else {
72 int status;
73 int childpid;
74
75 childpid = waitpid (pid, &status, 0);
76 if (childpid != pid)
77 { 78 {
79 LOG (GNUNET_ERROR_TYPE_WARNING, "Child terminated abnormally\n");
80 ret = GNUNET_SYSERR;
78 GNUNET_break (0); 81 GNUNET_break (0);
79 goto finalize; 82 goto finalize;
80 } 83 }
81 if (!WIFEXITED (status))
82 {
83 GNUNET_break (0);
84 goto finalize;
85 }
86 if (0 != WEXITSTATUS (status))
87 {
88 GNUNET_break (0);
89 }
90 } 84 }
91 ret = GNUNET_OK; 85 else
86 GNUNET_break (0);
92 87
93 finalize: 88 finalize:
94 (void) MPI_Finalize (); 89 (void) MPI_Finalize ();
95 return (GNUNET_OK == ret) ? 0 : 1; 90 if (GNUNET_OK == ret)
91 return 0;
92 printf ("Something went wrong\n");
93 return 1;
96} 94}