Actual source code: ex53.c

  1: static char help[] = "Test resource recycling and MPI_Comm and keyval creation in mpi or mpiuni\n";

  3: #include <petscsys.h>

  5: #define CHKMPIERR(ierr) \
  6:   do { \
  7:     if (ierr) MPI_Abort(MPI_COMM_WORLD, ierr); \
  8:   } while (0)

 10: int main(int argc, char **argv)
 11: {
 12:   int         err;
 13:   PetscInt    i;
 14:   PetscMPIInt key1, key2, attr1 = 100, attr2 = 200, *attr, flag;
 15:   MPI_Comm    newcomm;

 17:   err = MPI_Init(&argc, &argv);
 18:   CHKMPIERR(err);

 20:   /* Repeated keyval or comm create/free should not blow up MPI */
 21:   for (i = 0; i < 500; i++) {
 22:     err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
 23:     CHKMPIERR(err);
 24:     err = MPI_Comm_free_keyval(&key1);
 25:     CHKMPIERR(err);
 26:     err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
 27:     CHKMPIERR(err);
 28:     err = MPI_Comm_free(&newcomm);
 29:     CHKMPIERR(err);
 30:   }

 32:   /* The following keyval/attr code exposes a bug in old mpiuni code, where it had wrong newcomm returned in MPI_Comm_dup. */
 33:   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
 34:   CHKMPIERR(err);
 35:   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key2, NULL);
 36:   CHKMPIERR(err);
 37:   err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
 38:   CHKMPIERR(err);
 39:   if (MPI_COMM_WORLD == newcomm) printf("Error: wrong newcomm returned by MPI_Comm_dup()\n");

 41:   err = MPI_Comm_set_attr(MPI_COMM_WORLD, key1, &attr1);
 42:   CHKMPIERR(err);
 43:   err = MPI_Comm_set_attr(newcomm, key2, &attr2);
 44:   CHKMPIERR(err);
 45:   err = MPI_Comm_get_attr(newcomm, key1, &attr, &flag);
 46:   CHKMPIERR(err);
 47:   if (flag) printf("Error: newcomm should not have attribute for keyval %d\n", (int)key1);
 48:   err = MPI_Comm_get_attr(MPI_COMM_WORLD, key1, &attr, &flag);
 49:   CHKMPIERR(err);
 50:   if (*attr != attr1) printf("Error: expected attribute %d, but got %d\n", (int)attr1, (int)*attr);
 51:   err = MPI_Comm_get_attr(newcomm, key2, &attr, &flag);
 52:   CHKMPIERR(err);
 53:   if (*attr != attr2) printf("Error: expected attribute %d, but got %d\n", (int)attr2, (int)*attr);

 55:   err = MPI_Comm_delete_attr(MPI_COMM_WORLD, key1);
 56:   CHKMPIERR(err);
 57:   err = MPI_Comm_delete_attr(newcomm, key2);
 58:   CHKMPIERR(err);
 59:   err = MPI_Comm_free_keyval(&key1);
 60:   CHKMPIERR(err);
 61:   err = MPI_Comm_free_keyval(&key2);
 62:   CHKMPIERR(err);
 63:   err = MPI_Comm_free(&newcomm);
 64:   CHKMPIERR(err);

 66:   /* Init/Finalize PETSc multiple times when MPI is initialized */
 67:   for (i = 0; i < 500; i++) {
 69:     PetscInitialize(&argc, &argv, (char *)0, help);
 70:     PetscFinalize(); if (err) return err;
 71:   }

 73:   err = MPI_Finalize();
 74:   return err;
 75: }

 77: /*TEST
 78:    # Elemental in debug mode has bugs that it can not be repeatedly init/finalize'd for more than 300 times
 79:    testset:
 80:     output_file: output/ex53_1.out
 81:     test:
 82:       suffix: 1
 83:       requires: !elemental

 85:     test:
 86:       suffix: 2
 87:       requires: elemental !defined(PETSC_USE_DEBUG)
 88: TEST*/