xref: /petsc/src/sys/tests/ex53.c (revision 51b144c619aff302b570817d6f78637b8418d403)
1180dcd96SBarry Smith static char help[] = "Test resource recycling and MPI_Comm and keyval creation in mpi or mpiuni, no PETSc\n";
2f0463fa0SJunchao Zhang 
3f0463fa0SJunchao Zhang #include <petscsys.h>
4f0463fa0SJunchao Zhang 
5180dcd96SBarry Smith #define CHKMPIERR(err) \
69371c9d4SSatish Balay   do { \
7180dcd96SBarry Smith     if (err) MPI_Abort(MPI_COMM_WORLD, err); \
89371c9d4SSatish Balay   } while (0)
9f0463fa0SJunchao Zhang 
main(int argc,char ** argv)10d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
11d71ae5a4SJacob Faibussowitsch {
12d0609cedSBarry Smith   int         err;
13f0463fa0SJunchao Zhang   PetscInt    i;
14*b8b5be36SMartin Diehl   PetscMPIInt key1, key2, attr1 = 100, attr2 = 200, *attr, iflg;
15f0463fa0SJunchao Zhang   MPI_Comm    newcomm;
16f0463fa0SJunchao Zhang 
179371c9d4SSatish Balay   err = MPI_Init(&argc, &argv);
189371c9d4SSatish Balay   CHKMPIERR(err);
19f0463fa0SJunchao Zhang 
20f0463fa0SJunchao Zhang   /* Repeated keyval or comm create/free should not blow up MPI */
21f0463fa0SJunchao Zhang   for (i = 0; i < 500; i++) {
229371c9d4SSatish Balay     err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
239371c9d4SSatish Balay     CHKMPIERR(err);
249371c9d4SSatish Balay     err = MPI_Comm_free_keyval(&key1);
259371c9d4SSatish Balay     CHKMPIERR(err);
269371c9d4SSatish Balay     err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
279371c9d4SSatish Balay     CHKMPIERR(err);
289371c9d4SSatish Balay     err = MPI_Comm_free(&newcomm);
299371c9d4SSatish Balay     CHKMPIERR(err);
30f0463fa0SJunchao Zhang   }
31f0463fa0SJunchao Zhang 
32f0463fa0SJunchao Zhang   /* The following keyval/attr code exposes a bug in old mpiuni code, where it had wrong newcomm returned in MPI_Comm_dup. */
339371c9d4SSatish Balay   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
349371c9d4SSatish Balay   CHKMPIERR(err);
359371c9d4SSatish Balay   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key2, NULL);
369371c9d4SSatish Balay   CHKMPIERR(err);
379371c9d4SSatish Balay   err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
389371c9d4SSatish Balay   CHKMPIERR(err);
39f0463fa0SJunchao Zhang   if (MPI_COMM_WORLD == newcomm) printf("Error: wrong newcomm returned by MPI_Comm_dup()\n");
40f0463fa0SJunchao Zhang 
419371c9d4SSatish Balay   err = MPI_Comm_set_attr(MPI_COMM_WORLD, key1, &attr1);
429371c9d4SSatish Balay   CHKMPIERR(err);
439371c9d4SSatish Balay   err = MPI_Comm_set_attr(newcomm, key2, &attr2);
449371c9d4SSatish Balay   CHKMPIERR(err);
45*b8b5be36SMartin Diehl   err = MPI_Comm_get_attr(newcomm, key1, &attr, &iflg);
469371c9d4SSatish Balay   CHKMPIERR(err);
47*b8b5be36SMartin Diehl   if (iflg) printf("Error: newcomm should not have attribute for keyval %d\n", key1);
48*b8b5be36SMartin Diehl   err = MPI_Comm_get_attr(MPI_COMM_WORLD, key1, &attr, &iflg);
499371c9d4SSatish Balay   CHKMPIERR(err);
50300f1712SStefano Zampini   if (*attr != attr1) printf("Error: expected attribute %d, but got %d\n", attr1, *attr);
51*b8b5be36SMartin Diehl   err = MPI_Comm_get_attr(newcomm, key2, &attr, &iflg);
529371c9d4SSatish Balay   CHKMPIERR(err);
53300f1712SStefano Zampini   if (*attr != attr2) printf("Error: expected attribute %d, but got %d\n", attr2, *attr);
54f0463fa0SJunchao Zhang 
559371c9d4SSatish Balay   err = MPI_Comm_delete_attr(MPI_COMM_WORLD, key1);
569371c9d4SSatish Balay   CHKMPIERR(err);
579371c9d4SSatish Balay   err = MPI_Comm_delete_attr(newcomm, key2);
589371c9d4SSatish Balay   CHKMPIERR(err);
599371c9d4SSatish Balay   err = MPI_Comm_free_keyval(&key1);
609371c9d4SSatish Balay   CHKMPIERR(err);
619371c9d4SSatish Balay   err = MPI_Comm_free_keyval(&key2);
629371c9d4SSatish Balay   CHKMPIERR(err);
639371c9d4SSatish Balay   err = MPI_Comm_free(&newcomm);
649371c9d4SSatish Balay   CHKMPIERR(err);
65f0463fa0SJunchao Zhang 
66f0463fa0SJunchao Zhang   /* Init/Finalize PETSc multiple times when MPI is initialized */
67f0463fa0SJunchao Zhang   for (i = 0; i < 500; i++) {
68327415f7SBarry Smith     PetscFunctionBeginUser;
69c8025a54SPierre Jolivet     PetscCall(PetscInitialize(&argc, &argv, NULL, help));
70d0609cedSBarry Smith     PetscCall(PetscFinalize(); if (err) return err);
71f0463fa0SJunchao Zhang   }
72f0463fa0SJunchao Zhang 
73d0609cedSBarry Smith   err = MPI_Finalize();
74d0609cedSBarry Smith   return err;
75f0463fa0SJunchao Zhang }
76f0463fa0SJunchao Zhang 
77f0463fa0SJunchao Zhang /*TEST
78f0463fa0SJunchao Zhang    # Elemental in debug mode has bugs that it can not be repeatedly init/finalize'd for more than 300 times
79f0463fa0SJunchao Zhang    testset:
803886731fSPierre Jolivet     output_file: output/empty.out
81f0463fa0SJunchao Zhang     test:
82f0463fa0SJunchao Zhang       suffix: 1
83f0463fa0SJunchao Zhang       requires: !elemental
84f0463fa0SJunchao Zhang 
85f0463fa0SJunchao Zhang     test:
86f0463fa0SJunchao Zhang       suffix: 2
87dfd57a17SPierre Jolivet       requires: elemental !defined(PETSC_USE_DEBUG)
88f0463fa0SJunchao Zhang TEST*/
89