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 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