1e16082282abeeda6ce08f8e22a01125e970017b
[oweals/gnunet.git] / src / testbed / gnunet_mpi_test.c
1 #include "platform.h"
2 #include "gnunet_util_lib.h"
3 #include <mpi.h>
4
5 /**
6  * Generic logging shorthand
7  */
8 #define LOG(kind,...)                                           \
9   GNUNET_log_from (kind, "gnunet-mpi-test", __VA_ARGS__)
10
11 int main (int argc, char *argv[])
12 {
13   char *msg;
14   char *filename;
15   pid_t pid;
16   pid_t ppid;
17   int ntasks;
18   int rank;
19   int msg_size;
20   int ret;
21
22   ret = GNUNET_SYSERR;
23   if (MPI_SUCCESS != MPI_Init (&argc, &argv))
24     return 1;
25   if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks))
26     goto finalize;
27   if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank))
28     goto finalize;
29   pid = getpid();
30   (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank);
31   msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank);
32   printf ("%s", msg);
33   if (msg_size == GNUNET_DISK_fn_write (filename,
34                                         msg, msg_size,
35                                         GNUNET_DISK_PERM_USER_READ
36                                         | GNUNET_DISK_PERM_GROUP_READ
37                                         | GNUNET_DISK_PERM_USER_WRITE
38                                         | GNUNET_DISK_PERM_GROUP_WRITE))
39     ret = GNUNET_OK;
40   GNUNET_free (filename);
41   GNUNET_free (msg);
42   if (GNUNET_OK != ret)
43     goto finalize;
44
45   ret = GNUNET_SYSERR;
46   ppid = pid;
47   pid = fork ();
48   if (-1 == pid)
49   {
50     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork");
51     goto finalize;
52   }
53   if (0 == pid)
54   {
55     /* child 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       GNUNET_break (0);
79       goto finalize;
80     }
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   }
91   ret = GNUNET_OK;
92
93  finalize:
94   (void) MPI_Finalize ();
95   return (GNUNET_OK == ret) ? 0 : 1;
96 }