1f0463fa0SJunchao Zhang static char help[] = "Test resource recycling and MPI_Comm and keyval creation in mpi or mpiuni\n"; 2f0463fa0SJunchao Zhang 3f0463fa0SJunchao Zhang #include <petscsys.h> 4f0463fa0SJunchao Zhang 5*9371c9d4SSatish Balay #define CHKMPIERR(ierr) \ 6*9371c9d4SSatish Balay do { \ 7*9371c9d4SSatish Balay if (ierr) MPI_Abort(MPI_COMM_WORLD, ierr); \ 8*9371c9d4SSatish Balay } while (0) 9f0463fa0SJunchao Zhang 10*9371c9d4SSatish Balay int main(int argc, char **argv) { 11d0609cedSBarry Smith int err; 12f0463fa0SJunchao Zhang PetscInt i; 13f0463fa0SJunchao Zhang PetscMPIInt key1, key2, attr1 = 100, attr2 = 200, *attr, flag; 14f0463fa0SJunchao Zhang MPI_Comm newcomm; 15f0463fa0SJunchao Zhang 16*9371c9d4SSatish Balay err = MPI_Init(&argc, &argv); 17*9371c9d4SSatish Balay CHKMPIERR(err); 18f0463fa0SJunchao Zhang 19f0463fa0SJunchao Zhang /* Repeated keyval or comm create/free should not blow up MPI */ 20f0463fa0SJunchao Zhang for (i = 0; i < 500; i++) { 21*9371c9d4SSatish Balay err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL); 22*9371c9d4SSatish Balay CHKMPIERR(err); 23*9371c9d4SSatish Balay err = MPI_Comm_free_keyval(&key1); 24*9371c9d4SSatish Balay CHKMPIERR(err); 25*9371c9d4SSatish Balay err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm); 26*9371c9d4SSatish Balay CHKMPIERR(err); 27*9371c9d4SSatish Balay err = MPI_Comm_free(&newcomm); 28*9371c9d4SSatish Balay CHKMPIERR(err); 29f0463fa0SJunchao Zhang } 30f0463fa0SJunchao Zhang 31f0463fa0SJunchao Zhang /* The following keyval/attr code exposes a bug in old mpiuni code, where it had wrong newcomm returned in MPI_Comm_dup. */ 32*9371c9d4SSatish Balay err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL); 33*9371c9d4SSatish Balay CHKMPIERR(err); 34*9371c9d4SSatish Balay err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key2, NULL); 35*9371c9d4SSatish Balay CHKMPIERR(err); 36*9371c9d4SSatish Balay err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm); 37*9371c9d4SSatish Balay CHKMPIERR(err); 38f0463fa0SJunchao Zhang if (MPI_COMM_WORLD == newcomm) printf("Error: wrong newcomm returned by MPI_Comm_dup()\n"); 39f0463fa0SJunchao Zhang 40*9371c9d4SSatish Balay err = MPI_Comm_set_attr(MPI_COMM_WORLD, key1, &attr1); 41*9371c9d4SSatish Balay CHKMPIERR(err); 42*9371c9d4SSatish Balay err = MPI_Comm_set_attr(newcomm, key2, &attr2); 43*9371c9d4SSatish Balay CHKMPIERR(err); 44*9371c9d4SSatish Balay err = MPI_Comm_get_attr(newcomm, key1, &attr, &flag); 45*9371c9d4SSatish Balay CHKMPIERR(err); 46f0463fa0SJunchao Zhang if (flag) printf("Error: newcomm should not have attribute for keyval %d\n", (int)key1); 47*9371c9d4SSatish Balay err = MPI_Comm_get_attr(MPI_COMM_WORLD, key1, &attr, &flag); 48*9371c9d4SSatish Balay CHKMPIERR(err); 49f0463fa0SJunchao Zhang if (*attr != attr1) printf("Error: expected attribute %d, but got %d\n", (int)attr1, (int)*attr); 50*9371c9d4SSatish Balay err = MPI_Comm_get_attr(newcomm, key2, &attr, &flag); 51*9371c9d4SSatish Balay CHKMPIERR(err); 52f0463fa0SJunchao Zhang if (*attr != attr2) printf("Error: expected attribute %d, but got %d\n", (int)attr2, (int)*attr); 53f0463fa0SJunchao Zhang 54*9371c9d4SSatish Balay err = MPI_Comm_delete_attr(MPI_COMM_WORLD, key1); 55*9371c9d4SSatish Balay CHKMPIERR(err); 56*9371c9d4SSatish Balay err = MPI_Comm_delete_attr(newcomm, key2); 57*9371c9d4SSatish Balay CHKMPIERR(err); 58*9371c9d4SSatish Balay err = MPI_Comm_free_keyval(&key1); 59*9371c9d4SSatish Balay CHKMPIERR(err); 60*9371c9d4SSatish Balay err = MPI_Comm_free_keyval(&key2); 61*9371c9d4SSatish Balay CHKMPIERR(err); 62*9371c9d4SSatish Balay err = MPI_Comm_free(&newcomm); 63*9371c9d4SSatish Balay CHKMPIERR(err); 64f0463fa0SJunchao Zhang 65f0463fa0SJunchao Zhang /* Init/Finalize PETSc multiple times when MPI is initialized */ 66f0463fa0SJunchao Zhang for (i = 0; i < 500; i++) { 67327415f7SBarry Smith PetscFunctionBeginUser; 68b8abcfdeSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 69d0609cedSBarry Smith PetscCall(PetscFinalize(); if (err) return err); 70f0463fa0SJunchao Zhang } 71f0463fa0SJunchao Zhang 72d0609cedSBarry Smith err = MPI_Finalize(); 73d0609cedSBarry Smith return err; 74f0463fa0SJunchao Zhang } 75f0463fa0SJunchao Zhang 76f0463fa0SJunchao Zhang /*TEST 77f0463fa0SJunchao Zhang # Elemental in debug mode has bugs that it can not be repeatedly init/finalize'd for more than 300 times 78f0463fa0SJunchao Zhang testset: 79f0463fa0SJunchao Zhang output_file: output/ex53_1.out 80f0463fa0SJunchao Zhang test: 81f0463fa0SJunchao Zhang suffix: 1 82f0463fa0SJunchao Zhang requires: !elemental 83f0463fa0SJunchao Zhang 84f0463fa0SJunchao Zhang test: 85f0463fa0SJunchao Zhang suffix: 2 86dfd57a17SPierre Jolivet requires: elemental !defined(PETSC_USE_DEBUG) 87f0463fa0SJunchao Zhang TEST*/ 88