e08144a3cb1c35838a451663b1f7a8ca6013b80c
[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   char **argv2;
16   struct GNUNET_OS_Process *proc;
17   unsigned long code;
18   pid_t pid;
19   enum GNUNET_OS_ProcessStatusType proc_status;
20   int ntasks;
21   int rank;
22   int msg_size;
23   int ret;
24   unsigned int cnt;
25
26   ret = GNUNET_SYSERR;
27   if (argc < 2)
28   {
29     printf ("Need arguments: gnunet-mpi-test <cmd> <cmd_args>");
30     return 1;
31   }
32   if (MPI_SUCCESS != MPI_Init (&argc, &argv))
33   {
34     GNUNET_break (0);
35     return 1;
36   }
37   if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks))
38   {
39     GNUNET_break (0);
40     goto finalize;
41   }
42   if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank))
43   {
44     GNUNET_break (0);
45     goto finalize;
46   }
47   pid = getpid();
48   (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank);
49   msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank);
50   printf ("%s", msg);
51   if (msg_size == GNUNET_DISK_fn_write (filename,
52                                         msg, msg_size,
53                                         GNUNET_DISK_PERM_USER_READ
54                                         | GNUNET_DISK_PERM_GROUP_READ
55                                         | GNUNET_DISK_PERM_USER_WRITE
56                                         | GNUNET_DISK_PERM_GROUP_WRITE))
57     ret = GNUNET_OK;
58   GNUNET_free (filename);
59   GNUNET_free (msg);
60   if (GNUNET_OK != ret)
61   {
62     GNUNET_break (0);
63     goto finalize;
64   }
65   
66   ret = GNUNET_SYSERR;
67   argv2 = GNUNET_malloc (sizeof (char *) * (argc));
68   for (cnt = 1; cnt < argc; cnt++)
69     argv2[cnt - 1] = argv[cnt];
70   proc = GNUNET_OS_start_process_vap (GNUNET_NO,
71                                       GNUNET_OS_INHERIT_STD_ALL,
72                                       NULL,
73                                       NULL,
74                                       argv2[0], argv2);
75   if (NULL == proc)
76   {
77     printf ("Cannot exec\n");
78     GNUNET_free (argv2);
79     goto finalize;
80   }
81   do {
82     (void) sleep (1);
83     ret = GNUNET_OS_process_status (proc, &proc_status, &code);
84   } while (GNUNET_NO == ret);
85   GNUNET_free (argv2);
86   GNUNET_assert (GNUNET_NO != ret);
87   if (GNUNET_OK == ret)
88   {
89     if (0 != code)
90     {
91       LOG (GNUNET_ERROR_TYPE_WARNING, "Child terminated abnormally\n");
92       ret = GNUNET_SYSERR;
93       GNUNET_break (0);
94       goto finalize;
95     }
96   }
97   else
98     GNUNET_break (0);
99
100  finalize:
101   (void) MPI_Finalize ();
102   if (GNUNET_OK == ret)
103     return 0;
104   printf ("Something went wrong\n");
105   return 1;
106 }