1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3  *
4  *  (C) 2001 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7 #include "mpi.h"
8 #include <stdio.h>
9 #include "mpitest.h"
10 
11 /*
12 static char MTestDescrip[] = "Test creating and inserting attributes in \
13 different orders to ensure that the list management code handles all cases.";
14 */
15 
16 int checkAttrs( MPI_Win win, int n, int key[], int attrval[] );
17 int checkNoAttrs( MPI_Win win, int n, int key[] );
18 
main(int argc,char * argv[])19 int main( int argc, char *argv[] )
20 {
21     int errs = 0;
22     int key[3], attrval[3];
23     int i;
24     int buf[1];
25     MPI_Comm comm;
26     MPI_Win  win;
27 
28     MTest_Init( &argc, &argv );
29 
30     {
31 	comm = MPI_COMM_WORLD;
32 	MPI_Win_create( buf, sizeof(int), sizeof(int), MPI_INFO_NULL,
33 			comm, &win );
34 
35 	/* Create key values */
36 	for (i=0; i<3; i++) {
37 	    MPI_Win_create_keyval( MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN,
38 			       &key[i], (void *)0 );
39 	    attrval[i] = 1024 * i;
40 	}
41 
42 	/* Insert attribute in several orders.  Test after put with get,
43 	 then delete, then confirm delete with get. */
44 
45 	MPI_Win_set_attr( win, key[2], &attrval[2] );
46 	MPI_Win_set_attr( win, key[1], &attrval[1] );
47 	MPI_Win_set_attr( win, key[0], &attrval[0] );
48 
49 	errs += checkAttrs( win, 3, key, attrval );
50 
51 	MPI_Win_delete_attr( win, key[0] );
52 	MPI_Win_delete_attr( win, key[1] );
53 	MPI_Win_delete_attr( win, key[2] );
54 
55 	errs += checkNoAttrs( win, 3, key );
56 
57 	MPI_Win_set_attr( win, key[1], &attrval[1] );
58 	MPI_Win_set_attr( win, key[2], &attrval[2] );
59 	MPI_Win_set_attr( win, key[0], &attrval[0] );
60 
61 	errs += checkAttrs( win, 3, key, attrval );
62 
63 	MPI_Win_delete_attr( win, key[2] );
64 	MPI_Win_delete_attr( win, key[1] );
65 	MPI_Win_delete_attr( win, key[0] );
66 
67 	errs += checkNoAttrs( win, 3, key );
68 
69 	MPI_Win_set_attr( win, key[0], &attrval[0] );
70 	MPI_Win_set_attr( win, key[1], &attrval[1] );
71 	MPI_Win_set_attr( win, key[2], &attrval[2] );
72 
73 	errs += checkAttrs( win, 3, key, attrval );
74 
75 	MPI_Win_delete_attr( win, key[1] );
76 	MPI_Win_delete_attr( win, key[2] );
77 	MPI_Win_delete_attr( win, key[0] );
78 
79 	errs += checkNoAttrs( win, 3, key );
80 
81 	for (i=0; i<3; i++) {
82 	    MPI_Win_free_keyval( &key[i] );
83 	}
84 	MPI_Win_free( &win );
85     }
86 
87     MTest_Finalize( errs );
88     MPI_Finalize();
89     return 0;
90 
91 }
92 
checkAttrs(MPI_Win win,int n,int key[],int attrval[])93 int checkAttrs( MPI_Win win, int n, int key[], int attrval[] )
94 {
95     int errs = 0;
96     int i, flag, *val_p;
97 
98     for (i=0; i<n; i++) {
99 	MPI_Win_get_attr( win, key[i], &val_p, &flag );
100 	if (!flag) {
101 	    errs++;
102 	    fprintf( stderr, "Attribute for key %d not set\n", i );
103 	}
104 	else if (val_p != &attrval[i]) {
105 	    errs++;
106 	    fprintf( stderr, "Atribute value for key %d not correct\n",
107 		     i );
108 	}
109     }
110 
111     return errs;
112 }
113 
checkNoAttrs(MPI_Win win,int n,int key[])114 int checkNoAttrs( MPI_Win win, int n, int key[] )
115 {
116     int errs = 0;
117     int i, flag, *val_p;
118 
119     for (i=0; i<n; i++) {
120 	MPI_Win_get_attr( win, key[i], &val_p, &flag );
121 	if (flag) {
122 	    errs++;
123 	    fprintf( stderr, "Attribute for key %d set but should be deleted\n", i );
124 	}
125     }
126 
127     return errs;
128 }
129 
130