Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Reduce the size of partial shared malloc tests.
[simgrid.git] / teshsuite / smpi / mpich3-test / attr / attric.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *  (C) 2001 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7 /*
8
9   Exercise communicator routines for intercommunicators
10
11   This C version derived from attrt, which in turn was
12   derived from a Fortran test program from ...
13
14  */
15 #include <stdio.h>
16 #include "mpi.h"
17 #include "mpitest.h"
18
19 /* #define DEBUG */
20 int test_communicators(void);
21 int copy_fn(MPI_Comm, int, void *, void *, void *, int *);
22 int delete_fn(MPI_Comm, int, void *, void *);
23 #ifdef DEBUG
24 #define FFLUSH fflush(stdout);
25 #else
26 #define FFLUSH
27 #endif
28
29 int main(int argc, char **argv)
30 {
31     int errs = 0;
32     MTest_Init(&argc, &argv);
33
34     errs = test_communicators();
35
36     MTest_Finalize(errs);
37     MPI_Finalize();
38     return 0;
39 }
40
41 int copy_fn(MPI_Comm oldcomm, int keyval, void *extra_state,
42             void *attribute_val_in, void *attribute_val_out, int *flag)
43 {
44     /* Note that if (sizeof(int) < sizeof(void *), just setting the int
45      * part of attribute_val_out may leave some dirty bits
46      */
47     *(MPI_Aint *) attribute_val_out = (MPI_Aint) attribute_val_in;
48     *flag = 1;
49     return MPI_SUCCESS;
50 }
51
52 int delete_fn(MPI_Comm comm, int keyval, void *attribute_val, void *extra_state)
53 {
54     int world_rank;
55     MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
56     if ((MPI_Aint) attribute_val != (MPI_Aint) world_rank) {
57         printf("incorrect attribute value %d\n", *(int *) attribute_val);
58         MPI_Abort(MPI_COMM_WORLD, 1005);
59     }
60     return MPI_SUCCESS;
61 }
62
63 int test_communicators(void)
64 {
65     MPI_Comm dup_comm, comm;
66     void *vvalue;
67     int flag, world_rank, world_size, key_1, key_3;
68     int errs = 0;
69     MPI_Aint value;
70     int isLeft;
71
72     MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
73     MPI_Comm_size(MPI_COMM_WORLD, &world_size);
74 #ifdef DEBUG
75     if (world_rank == 0) {
76         printf("*** Communicators ***\n");
77         fflush(stdout);
78     }
79 #endif
80
81     while (MTestGetIntercomm(&comm, &isLeft, 2)) {
82         MTestPrintfMsg(1, "start while loop, isLeft=%s\n", (isLeft ? "TRUE" : "FALSE"));
83
84         if (comm == MPI_COMM_NULL) {
85             MTestPrintfMsg(1, "got COMM_NULL, skipping\n");
86             continue;
87         }
88
89         /*
90          * Check Comm_dup by adding attributes to comm & duplicating
91          */
92
93         value = 9;
94         MPI_Keyval_create(copy_fn, delete_fn, &key_1, &value);
95         MTestPrintfMsg(1, "Keyval_create key=%#x value=%d\n", key_1, value);
96         value = 7;
97         MPI_Keyval_create(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN, &key_3, &value);
98         MTestPrintfMsg(1, "Keyval_create key=%#x value=%d\n", key_3, value);
99
100         /* This may generate a compilation warning; it is, however, an
101          * easy way to cache a value instead of a pointer */
102         /* printf("key1 = %x key3 = %x\n", key_1, key_3); */
103         MPI_Attr_put(comm, key_1, (void *) (MPI_Aint) world_rank);
104         MPI_Attr_put(comm, key_3, (void *) 0);
105
106         MTestPrintfMsg(1, "Comm_dup\n");
107         MPI_Comm_dup(comm, &dup_comm);
108
109         /* Note that if sizeof(int) < sizeof(void *), we can't use
110          * (void **)&value to get the value we passed into Attr_put.  To avoid
111          * problems (e.g., alignment errors), we recover the value into
112          * a (void *) and cast to int. Note that this may generate warning
113          * messages from the compiler.  */
114         MPI_Attr_get(dup_comm, key_1, (void **) &vvalue, &flag);
115         value = (MPI_Aint) vvalue;
116
117         if (!flag) {
118             errs++;
119             printf("dup_comm key_1 not found on %d\n", world_rank);
120             fflush(stdout);
121             MPI_Abort(MPI_COMM_WORLD, 3004);
122         }
123
124         if (value != world_rank) {
125             errs++;
126             printf("dup_comm key_1 value incorrect: %ld\n", (long) value);
127             fflush(stdout);
128             MPI_Abort(MPI_COMM_WORLD, 3005);
129         }
130
131         MPI_Attr_get(dup_comm, key_3, (void **) &vvalue, &flag);
132         value = (MPI_Aint) vvalue;
133         if (flag) {
134             errs++;
135             printf("dup_comm key_3 found!\n");
136             fflush(stdout);
137             MPI_Abort(MPI_COMM_WORLD, 3008);
138         }
139         MTestPrintfMsg(1, "Keyval_free key=%#x\n", key_1);
140         MPI_Keyval_free(&key_1);
141         MTestPrintfMsg(1, "Keyval_free key=%#x\n", key_3);
142         MPI_Keyval_free(&key_3);
143         /*
144          * Free all communicators created
145          */
146         MTestPrintfMsg(1, "Comm_free comm\n");
147         MPI_Comm_free(&comm);
148         MTestPrintfMsg(1, "Comm_free dup_comm\n");
149         MPI_Comm_free(&dup_comm);
150     }
151
152     return errs;
153 }