xref: /petsc/src/sys/tests/ex53.c (revision f97672e55eacc8688507b9471cd7ec2664d7f203)
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