X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Fgnunet_mpi_test.c;h=7fe7a75d76fc9104e077cadf5c9938a0332ae4e1;hb=2105059516320800eaa8fff1196b58f29a50ba7c;hp=1e16082282abeeda6ce08f8e22a01125e970017b;hpb=3b44ddf34ee8b813c3dc14ce5c73fd789803ad14;p=oweals%2Fgnunet.git diff --git a/src/testbed/gnunet_mpi_test.c b/src/testbed/gnunet_mpi_test.c index 1e1608228..7fe7a75d7 100644 --- a/src/testbed/gnunet_mpi_test.c +++ b/src/testbed/gnunet_mpi_test.c @@ -8,89 +8,100 @@ #define LOG(kind,...) \ GNUNET_log_from (kind, "gnunet-mpi-test", __VA_ARGS__) -int main (int argc, char *argv[]) +int +main (int argc, char *argv[]) { char *msg; char *filename; + char **argv2; + struct GNUNET_OS_Process *proc; + unsigned long code; pid_t pid; - pid_t ppid; + enum GNUNET_OS_ProcessStatusType proc_status; int ntasks; int rank; int msg_size; int ret; + unsigned int cnt; ret = GNUNET_SYSERR; + if (argc < 2) + { + printf ("Need arguments: gnunet-mpi-test "); + return 1; + } if (MPI_SUCCESS != MPI_Init (&argc, &argv)) + { + GNUNET_break (0); return 1; + } if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks)) + { + GNUNET_break (0); goto finalize; + } if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank)) + { + GNUNET_break (0); goto finalize; - pid = getpid(); + } + pid = getpid (); (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank); msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank); printf ("%s", msg); - if (msg_size == GNUNET_DISK_fn_write (filename, - msg, msg_size, - GNUNET_DISK_PERM_USER_READ - | GNUNET_DISK_PERM_GROUP_READ - | GNUNET_DISK_PERM_USER_WRITE - | GNUNET_DISK_PERM_GROUP_WRITE)) + if (msg_size == + GNUNET_DISK_fn_write (filename, msg, msg_size, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_GROUP_READ | + GNUNET_DISK_PERM_USER_WRITE | + GNUNET_DISK_PERM_GROUP_WRITE)) ret = GNUNET_OK; GNUNET_free (filename); GNUNET_free (msg); if (GNUNET_OK != ret) + { + GNUNET_break (0); goto finalize; + } ret = GNUNET_SYSERR; - ppid = pid; - pid = fork (); - if (-1 == pid) + argv2 = GNUNET_malloc (sizeof (char *) * (argc)); + for (cnt = 1; cnt < argc; cnt++) + argv2[cnt - 1] = argv[cnt]; + proc = + GNUNET_OS_start_process_vap (GNUNET_NO, GNUNET_OS_INHERIT_STD_ALL, NULL, + NULL, NULL, argv2[0], argv2); + if (NULL == proc) { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork"); + printf ("Cannot exec\n"); + GNUNET_free (argv2); goto finalize; } - if (0 == pid) + do { - /* child code */ - pid = getpid (); - (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank); - msg_size = GNUNET_asprintf (&msg, "Child of %d\n", (int) ppid); - printf ("%s", msg); - if (msg_size == GNUNET_DISK_fn_write (filename, - msg, msg_size, - GNUNET_DISK_PERM_USER_READ - | GNUNET_DISK_PERM_GROUP_READ - | GNUNET_DISK_PERM_USER_WRITE - | GNUNET_DISK_PERM_GROUP_WRITE)) - ret = GNUNET_OK; - GNUNET_free (filename); - GNUNET_free (msg); - return (GNUNET_OK == ret) ? 0 : 1; + (void) sleep (1); + ret = GNUNET_OS_process_status (proc, &proc_status, &code); } - else { - int status; - int childpid; - - childpid = waitpid (pid, &status, 0); - if (childpid != pid) - { - GNUNET_break (0); - goto finalize; - } - if (!WIFEXITED (status)) + while (GNUNET_NO == ret); + GNUNET_free (argv2); + GNUNET_assert (GNUNET_NO != ret); + if (GNUNET_OK == ret) + { + if (0 != code) { + LOG (GNUNET_ERROR_TYPE_WARNING, "Child terminated abnormally\n"); + ret = GNUNET_SYSERR; GNUNET_break (0); goto finalize; } - if (0 != WEXITSTATUS (status)) - { - GNUNET_break (0); - } } - ret = GNUNET_OK; + else + GNUNET_break (0); - finalize: +finalize: (void) MPI_Finalize (); - return (GNUNET_OK == ret) ? 0 : 1; + if (GNUNET_OK == ret) + return 0; + printf ("Something went wrong\n"); + return 1; }