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