1c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/
3c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                         ---*/
4157a8c40575f4ce99c36a91434a43afd4db13717sewardj/*--- A library of wrappers for MPI 2 functions.              ---*/
5c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                         ---*/
6c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/
7c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
8c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ----------------------------------------------------------------
9c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
10c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Notice that the following BSD-style license applies to this one
11c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   file (mpiwrap.c) only.  The rest of Valgrind is licensed under the
12c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   terms of the GNU General Public License, version 2, unless
13c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   otherwise indicated.  See the COPYING file in the source
14c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   distribution for details.
15c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
16c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ----------------------------------------------------------------
17c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
18c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   This file is part of Valgrind, a dynamic binary instrumentation
19c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   framework.
20c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
210f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj   Copyright (C) 2006-2013 OpenWorks LLP.  All rights reserved.
22c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
23c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Redistribution and use in source and binary forms, with or without
24c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   modification, are permitted provided that the following conditions
25c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   are met:
26c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
27c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   1. Redistributions of source code must retain the above copyright
28c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      notice, this list of conditions and the following disclaimer.
29c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
30c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   2. The origin of this software must not be misrepresented; you must
31c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      not claim that you wrote the original software.  If you use this
32c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      software in a product, an acknowledgment in the product
33c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      documentation would be appreciated but is not required.
34c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
35c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   3. Altered source versions must be plainly marked as such, and must
36c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      not be misrepresented as being the original software.
37c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
38c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   4. The name of the author may not be used to endorse or promote
39c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      products derived from this software without specific prior written
40c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      permission.
41c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
42c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
43c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
44c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
46c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
48c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
49c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
50c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
51c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
52c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
54c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Neither the names of the U.S. Department of Energy nor the
55c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   University of California nor the names of its contributors may be
56c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   used to endorse or promote products derived from this software
57c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   without prior written permission.
58c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
59c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
60753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj/* Handling of MPI_STATUS{ES}_IGNORE for MPI_Status* arguments.
61753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
62753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   The MPI-2 spec allows many functions which have MPI_Status* purely
63753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   as an out parameter, to accept the constants MPI_STATUS_IGNORE or
64753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_STATUSES_IGNORE there instead, if the caller does not care
65753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   about the status.  See the MPI-2 spec sec 4.5.1 ("Passing
66753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_STATUS_IGNORE for Status").  (mpi2-report.pdf, 1615898 bytes,
67753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   md5=694a5efe2fd291eecf7e8c9875b5f43f).
68753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
69753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   This library handles such cases by allocating a fake MPI_Status
70753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   object (on the stack) or an array thereof (on the heap), and
71753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   passing that onwards instead.  From the outside the caller sees no
72753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   difference.  Unfortunately the simpler approach of merely detecting
73753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   and handling these special cases at a lower level does not work,
74753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   because we need to use information returned in MPI_Status*
75753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   arguments to paint result buffers, even if the caller doesn't
76753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   supply a real MPI_Status object.
77753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
78753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   Eg, MPI_Recv.  We can't paint the result buffer without knowing how
79753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   many items arrived; but we can't find that out without passing a
80753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   real MPI_Status object to the (real) MPI_Recv call.  Hence, if the
81753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   caller did not supply one, we have no option but to use a temporary
82753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   stack allocated one for the inner call.  Ditto, more indirectly
83753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   (via maybe_complete) for nonblocking receives and the various
84753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   associated wait/test calls. */
85753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
86c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
87c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
88c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- includes                                             ---*/
89c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
90c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
91c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <stdio.h>
92c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <assert.h>
93c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <unistd.h>     /* getpid */
94c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <stdlib.h>     /* exit */
95c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <string.h>     /* strstr */
96c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <pthread.h>    /* pthread_mutex_{lock,unlock} */
97c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
98c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Include Valgrind magic macros for writing wrappers. */
99209740130b440ab0ed1a37010ca17031e61caa17sewardj#include "../memcheck/memcheck.h"
100c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
101dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj/* Include macros for VALGRIND_{DIS,EN}ABLE_ERROR_REPORTING.
102dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   This is somewhat experimental and hence disable-able, by
103dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   setting cONFIG_DER to zero. */
104dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj#include "../include/valgrind.h"
105dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj
106dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj#define cONFIG_DER  1   /* set to 0 to disable */
107dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj
108c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
109c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
110c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Connect to MPI library                               ---*/
111c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
112c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
113c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Include headers for whatever MPI implementation the wrappers are to
11480637751e7c438c7ed679ac2094c6c205882f0cesewardj   be used with.  The configure system will tell us what the path to
11580637751e7c438c7ed679ac2094c6c205882f0cesewardj   the chosen MPI implementation is, via -I.. to the compiler. */
116c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include "mpi.h"
117c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
118c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Where are API symbols?
119abbad834efb4e359020d79961c9214cac817aea5sewardj   Open MPI      lib/libmpi.so,   soname = libmpi.so.0
120abbad834efb4e359020d79961c9214cac817aea5sewardj   Quadrics MPI  lib/libmpi.so,   soname = libmpi.so.0
121abbad834efb4e359020d79961c9214cac817aea5sewardj   MPICH         libmpich.so.1.0, soname = libmpich.so.1.0
122abbad834efb4e359020d79961c9214cac817aea5sewardj
1236e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj   A suitable soname to match with is therefore "libmpi*.so*".
124c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
1256e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj#define I_WRAP_FNNAME_U(_name) \
1266e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj        I_WRAP_SONAME_FNNAME_ZU(libmpiZaZdsoZa,_name)
127c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
128cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
129753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj/* Define HAVE_MPI_STATUS_IGNORE iff we have to deal with
130753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_STATUS{ES}_IGNORE. */
131753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#if MPI_VERSION >= 2 \
132753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj    || (defined(MPI_STATUS_IGNORE) && defined(MPI_STATUSES_IGNORE))
133753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#  undef HAVE_MPI_STATUS_IGNORE
134753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#  define HAVE_MPI_STATUS_IGNORE 1
135753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#else
136753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#  undef HAVE_MPI_STATUS_IGNORE
137753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#endif
138753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
139753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
140c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
141c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Decls                                                ---*/
142c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
143c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
144c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjtypedef  unsigned char  Bool;
145c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#define False ((Bool)0)
146c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#define True  ((Bool)1)
147c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
14863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* Word, UWord are machine words - same size as a pointer.  This is
14963daa8afee0bf09c5527975d14f884d98ee77f9esewardj   checked at startup.  The wrappers below use 'long' to mean a
15063daa8afee0bf09c5527975d14f884d98ee77f9esewardj   machine word - this too is tested at startup. */
15163daa8afee0bf09c5527975d14f884d98ee77f9esewardjtypedef    signed long  Word;
15263daa8afee0bf09c5527975d14f884d98ee77f9esewardjtypedef  unsigned long  UWord;
15363daa8afee0bf09c5527975d14f884d98ee77f9esewardj
154cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj#if !defined(offsetof)
155cbc2e0e2161539f16906082b35653d81fc2fef02sewardj#  define offsetof(type,memb) ((UWord)&((type*)0)->memb)
156cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj#endif
157cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj
158cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj/* Find the size of long double image (not 'sizeof(long double)').
159cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   See comments in sizeofOneNamedTy. */
160cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardjstatic long sizeof_long_double_image ( void );
161cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
162c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
163c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
164c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Simple helpers                                       ---*/
165c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
166c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
167c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ------ Helpers for debug printing ------ */
168c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
169c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* constant */
170c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic const char* preamble = "valgrind MPI wrappers";
171c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
172c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* established at startup */
173d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic pid_t my_pid         = -1;
174d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic char* options_str    = NULL;
175d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic int   opt_verbosity  = 1;
176d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic Bool  opt_missing    = 0; /* 0:silent; 1:warn; 2:abort */
177d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic Bool  opt_help       = False;
178d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic Bool  opt_initkludge = False;
179c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjstatic void before ( char* fnname )
181c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
182c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   /* This isn't thread-safe wrt 'done' (no locking).  It's not
183c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      critical. */
184c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   static int done = 0;
185c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (done == 0) {
186c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      done = 1;
187c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      my_pid = getpid();
188c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      options_str = getenv("MPIWRAP_DEBUG");
189ec8b614219f9746385ee7d0bc20e209302713f68sewardj      if (options_str) {
19063daa8afee0bf09c5527975d14f884d98ee77f9esewardj         if (NULL != strstr(options_str, "warn"))
19163daa8afee0bf09c5527975d14f884d98ee77f9esewardj            opt_missing = 1;
19263daa8afee0bf09c5527975d14f884d98ee77f9esewardj         if (NULL != strstr(options_str, "strict"))
19363daa8afee0bf09c5527975d14f884d98ee77f9esewardj            opt_missing = 2;
194ec8b614219f9746385ee7d0bc20e209302713f68sewardj         if (NULL != strstr(options_str, "verbose"))
195ec8b614219f9746385ee7d0bc20e209302713f68sewardj            opt_verbosity++;
196ec8b614219f9746385ee7d0bc20e209302713f68sewardj         if (NULL != strstr(options_str, "quiet"))
197ec8b614219f9746385ee7d0bc20e209302713f68sewardj            opt_verbosity--;
19863daa8afee0bf09c5527975d14f884d98ee77f9esewardj         if (NULL != strstr(options_str, "help"))
19963daa8afee0bf09c5527975d14f884d98ee77f9esewardj            opt_help = True;
200d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         if (NULL != strstr(options_str, "initkludge"))
201d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj            opt_initkludge = True;
202ec8b614219f9746385ee7d0bc20e209302713f68sewardj      }
203ec8b614219f9746385ee7d0bc20e209302713f68sewardj      if (opt_verbosity > 0)
204ec8b614219f9746385ee7d0bc20e209302713f68sewardj         fprintf(stderr, "%s %5d: Active for pid %d\n",
205ec8b614219f9746385ee7d0bc20e209302713f68sewardj                         preamble, my_pid, my_pid);
20663daa8afee0bf09c5527975d14f884d98ee77f9esewardj      /* Sanity check - that Word/UWord really are machine words. */
20763daa8afee0bf09c5527975d14f884d98ee77f9esewardj      assert(sizeof(Word)  == sizeof(void*));
20863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      assert(sizeof(UWord) == sizeof(void*));
209301a50f9bddfaf2c894031d9750282d69bf2103csewardj      /* Sanity check - char is byte-sized (else address calculations
210301a50f9bddfaf2c894031d9750282d69bf2103csewardj         in walk_type don't work. */
211301a50f9bddfaf2c894031d9750282d69bf2103csewardj      assert(sizeof(char) == 1);
212c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (opt_help) {
213c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "\n");
214c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "Valid options for the MPIWRAP_DEBUG environment"
215c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         " variable are:\n");
216c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "\n");
217d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         fprintf(stderr, "   quiet       be silent except for errors\n");
218d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         fprintf(stderr, "   verbose     show wrapper entries/exits\n");
219d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         fprintf(stderr, "   strict      abort the program if a function"
220c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         " with no wrapper is used\n");
221d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         fprintf(stderr, "   warn        give a warning if a function"
22263daa8afee0bf09c5527975d14f884d98ee77f9esewardj                         " with no wrapper is used\n");
223d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         fprintf(stderr, "   help        display this message, then exit\n");
224d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj         fprintf(stderr, "   initkludge  debugging hack; do not use\n");
225c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "\n");
226c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "Multiple options are allowed, eg"
227c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         " MPIWRAP_DEBUG=strict,verbose\n");
22863daa8afee0bf09c5527975d14f884d98ee77f9esewardj         fprintf(stderr, "Note: 'warn' generates output even if 'quiet'"
22963daa8afee0bf09c5527975d14f884d98ee77f9esewardj                         " is also specified\n");
230c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "\n");
231c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         fprintf(stderr, "%s %5d: exiting now\n", preamble, my_pid );
232c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         exit(1);
233c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
234ec8b614219f9746385ee7d0bc20e209302713f68sewardj      if (opt_verbosity > 0)
235ec8b614219f9746385ee7d0bc20e209302713f68sewardj         fprintf(stderr,
236ec8b614219f9746385ee7d0bc20e209302713f68sewardj                 "%s %5d: Try MPIWRAP_DEBUG=help for possible options\n",
237ec8b614219f9746385ee7d0bc20e209302713f68sewardj                 preamble, my_pid);
238c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
239c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
240ec8b614219f9746385ee7d0bc20e209302713f68sewardj   if (opt_verbosity > 1)
241c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      fprintf(stderr, "%s %5d: enter PMPI_%s\n", preamble,  my_pid, fnname );
242c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
243c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
244d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ void after ( char* fnname, int err )
245c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
246ec8b614219f9746385ee7d0bc20e209302713f68sewardj   if (opt_verbosity > 1)
247c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      fprintf(stderr, "%s %5d:  exit PMPI_%s (err = %d)\n",
248c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                      preamble, my_pid, fnname, err );
249c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
250c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
251c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void barf ( char* msg )
252c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
253c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   fprintf(stderr, "%s %5d: fatal: %s\n",   preamble, my_pid, msg);
254c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   fprintf(stderr, "%s %5d: exiting now\n", preamble, my_pid );
255c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   exit(1);
256c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
257c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
258533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj/* Half-hearted type-showing function (for debugging). */
259533bfda1c401c38de38a8c12111ab2cb9346eec5sewardjstatic void showTy ( FILE* f, MPI_Datatype ty )
260533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj{
261533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj        if (ty == MPI_DATATYPE_NULL)  fprintf(f,"DATATYPE_NULL");
262533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_BYTE)           fprintf(f,"BYTE");
263533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_PACKED)         fprintf(f,"PACKED");
264533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_CHAR)           fprintf(f,"CHAR");
265533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_SHORT)          fprintf(f,"SHORT");
266533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_INT)            fprintf(f,"INT");
267533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LONG)           fprintf(f,"LONG");
268533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_FLOAT)          fprintf(f,"FLOAT");
269533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_DOUBLE)         fprintf(f,"DOUBLE");
270533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LONG_DOUBLE)    fprintf(f,"LONG_DOUBLE");
271533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_UNSIGNED_CHAR)  fprintf(f,"UNSIGNED_CHAR");
272533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_UNSIGNED_SHORT) fprintf(f,"UNSIGNED_SHORT");
273533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_UNSIGNED_LONG)  fprintf(f,"UNSIGNED_LONG");
274533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_UNSIGNED)       fprintf(f,"UNSIGNED");
275533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_FLOAT_INT)      fprintf(f,"FLOAT_INT");
276533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_DOUBLE_INT)     fprintf(f,"DOUBLE_INT");
277533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LONG_DOUBLE_INT) fprintf(f,"LONG_DOUBLE_INT");
278533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LONG_INT)       fprintf(f,"LONG_INT");
279533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_SHORT_INT)      fprintf(f,"SHORT_INT");
280533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_2INT)           fprintf(f,"2INT");
281533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_UB)             fprintf(f,"UB");
282533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LB)             fprintf(f,"LB");
283533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj#  if defined(MPI_WCHAR)
284533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_WCHAR)          fprintf(f,"WCHAR");
285533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj#  endif
286533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LONG_LONG_INT)  fprintf(f,"LONG_LONG_INT");
28787f75f7f6196345db089f9334fbcdacd96b060d8sewardj#  if defined(MPI_LONG_LONG)
288533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_LONG_LONG)      fprintf(f,"LONG_LONG");
28987f75f7f6196345db089f9334fbcdacd96b060d8sewardj#  endif
290582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj#  if defined(MPI_UNSIGNED_LONG_LONG)
291533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else if (ty == MPI_UNSIGNED_LONG_LONG) fprintf(f,"UNSIGNED_LONG_LONG");
292582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj#  endif
293443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_REAL8)
294443aa37437f8637e8842ada083a400c5578a2d8asewardj   else if (ty == MPI_REAL8)          fprintf(f, "REAL8");
295443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
296443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_REAL4)
297443aa37437f8637e8842ada083a400c5578a2d8asewardj   else if (ty == MPI_REAL4)          fprintf(f, "REAL4");
298443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
299a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_REAL)
300a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_REAL)           fprintf(f, "REAL");
301a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
302443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_INTEGER8)
303443aa37437f8637e8842ada083a400c5578a2d8asewardj   else if (ty == MPI_INTEGER8)       fprintf(f, "INTEGER8");
304443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
305443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_INTEGER4)
306443aa37437f8637e8842ada083a400c5578a2d8asewardj   else if (ty == MPI_INTEGER4)       fprintf(f, "INTEGER4");
307443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
308a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_INTEGER)
309a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_INTEGER)        fprintf(f, "INTEGER");
310a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
311a8c487f6ba9811fdc483ff02925dd34f93be09basewardj#  if defined(MPI_DOUBLE_PRECISION)
312a8c487f6ba9811fdc483ff02925dd34f93be09basewardj   else if (ty == MPI_DOUBLE_PRECISION) fprintf(f, "DOUBLE_PRECISION");
313a8c487f6ba9811fdc483ff02925dd34f93be09basewardj#  endif
314a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_COMPLEX)
315a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_COMPLEX)          fprintf(f, "COMPLEX");
316a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
317a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_DOUBLE_COMPLEX)
318a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_DOUBLE_COMPLEX)   fprintf(f, "DOUBLE_COMPLEX");
319a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
320a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_LOGICAL)
321a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_LOGICAL)          fprintf(f, "LOGICAL");
322a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
323a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2INTEGER)
324a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_2INTEGER)         fprintf(f, "2INTEGER");
325a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
326a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2COMPLEX)
327a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_2COMPLEX)         fprintf(f, "2COMPLEX");
328a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
329a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2DOUBLE_COMPLEX)
330a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_2DOUBLE_COMPLEX)  fprintf(f, "2DOUBLE_COMPLEX");
331a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
332a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2REAL)
333a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_2REAL)            fprintf(f, "2REAL");
334a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
335a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2DOUBLE_PRECISION)
336a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_2DOUBLE_PRECISION) fprintf(f, "2DOUBLE_PRECISION");
337a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
338a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_CHARACTER)
339a7802967336adb950dcfb71f152759e45ea16e4bsewardj   else if (ty == MPI_CHARACTER)         fprintf(f, "CHARACTER");
340a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
341533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   else fprintf(f,"showTy:???");
342533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj}
343533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj
344533bfda1c401c38de38a8c12111ab2cb9346eec5sewardjstatic void showCombiner ( FILE* f, int combiner )
345533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj{
346533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   switch (combiner) {
347533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_NAMED:       fprintf(f, "NAMED"); break;
348cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_DUP)
349533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_DUP:         fprintf(f, "DUP"); break;
350cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
351533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_CONTIGUOUS:  fprintf(f, "CONTIGUOUS"); break;
352533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_VECTOR:      fprintf(f, "VECTOR"); break;
353cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_HVECTOR_INTEGER)
354533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_HVECTOR_INTEGER: fprintf(f, "HVECTOR_INTEGER"); break;
355cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
356533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_HVECTOR:     fprintf(f, "HVECTOR"); break;
357533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_INDEXED:     fprintf(f, "INDEXED"); break;
358cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_HINDEXED_INTEGER)
359533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_HINDEXED_INTEGER: fprintf(f, "HINDEXED_INTEGER"); break;
360cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
361533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_HINDEXED:    fprintf(f, "HINDEXED"); break;
362cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_INDEXED_BLOCK)
363533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_INDEXED_BLOCK: fprintf(f, "INDEXED_BLOCK"); break;
364cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
365cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_STRUCT_INTEGER)
366533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_STRUCT_INTEGER: fprintf(f, "STRUCT_INTEGER"); break;
367cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
368533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_STRUCT:      fprintf(f, "STRUCT"); break;
369cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_SUBARRAY)
370533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_SUBARRAY:    fprintf(f, "SUBARRAY"); break;
371cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
372cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_DARRAY)
373533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_DARRAY:      fprintf(f, "DARRAY"); break;
374cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
375cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_F90_REAL)
376533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_F90_REAL:    fprintf(f, "F90_REAL"); break;
377cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
378cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_F90_COMPLEX)
379533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_F90_COMPLEX: fprintf(f, "F90_COMPLEX"); break;
380cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
381cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_F90_INTEGER)
382533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_F90_INTEGER: fprintf(f, "F90_INTEGER"); break;
383cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
384cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if   defined(MPI_COMBINER_RESIZED)
385533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      case MPI_COMBINER_RESIZED:     fprintf(f, "RESIZED"); break;
386cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#     endif
387533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj      default: fprintf(f, "showCombiner:??"); break;
388533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj   }
389533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj}
390533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj
391533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj
392c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ------ Get useful bits of info ------ */
393c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
394c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Note, PMPI_Comm_rank/size are themselves wrapped.  Should work
395c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   fine. */
396c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
397d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ int comm_rank ( MPI_Comm comm )
398c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
399c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int err, r;
400c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   err = PMPI_Comm_rank(comm, &r);
401c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err ? 0/*arbitrary*/ : r;
402c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
403c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
404d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ int comm_size ( MPI_Comm comm )
405c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
406c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int err, r;
407c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   err = PMPI_Comm_size(comm, &r);
408c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err ? 0/*arbitrary*/ : r;
409c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
410c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
411d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ Bool count_from_Status( /*OUT*/int* recv_count,
412c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                      MPI_Datatype datatype,
413c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                      MPI_Status* status)
414c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
415c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int n;
41626c60a8706eb45cbf303437adc87e313e104d4efsewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
417c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int err = PMPI_Get_count(status, datatype, &n);
41826c60a8706eb45cbf303437adc87e313e104d4efsewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
419c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS) {
420c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      *recv_count = n;
421c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      return True;
422c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   } else {
423c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      return False;
424c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
425c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
426c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
427c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* It's critical that we can do equality on MPI_Requests.
428c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Unfortunately these are opaque objects to us (handles, in the
429c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   parlance of the MPI 1.1 spec).  Fortunately Sec 2.4.1 ("Opaque
430c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Objects") specifies that "In C, [...] These [handles] should be
431c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   types that support assignment and equality operations."  Hence the
432c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   following function should compile for any compliant definition of
433c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   MPI_Request. */
434d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__
435c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjBool eq_MPI_Request ( MPI_Request r1, MPI_Request r2 )
436c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
437c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return r1 == r2;
438c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
439c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
440753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj/* Return True if status is MPI_STATUS_IGNORE or MPI_STATUSES_IGNORE.
441753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   On MPI-1.x platforms which don't have these symbols (and they would
442753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   only have them if they've been backported from 2.x) always return
443753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   False. */
444753ab9ddc9605773accb060f2762c0eb063a0fc2sewardjstatic __inline__
445753ab9ddc9605773accb060f2762c0eb063a0fc2sewardjBool isMSI ( MPI_Status* status )
446753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj{
447753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#  if defined(HAVE_MPI_STATUS_IGNORE)
448753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   return status == MPI_STATUSES_IGNORE || status == MPI_STATUS_IGNORE;
449753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#  else
450753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   return False;
451753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#  endif
452753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj}
453753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj
4548717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj/* Get the 'extent' of a type.  Note, as per the MPI spec this
4558717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj   includes whatever padding would be required when using 'ty' in an
4568717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj   array. */
457301a50f9bddfaf2c894031d9750282d69bf2103csewardjstatic long extentOfTy ( MPI_Datatype ty )
458301a50f9bddfaf2c894031d9750282d69bf2103csewardj{
459301a50f9bddfaf2c894031d9750282d69bf2103csewardj   int      r;
460301a50f9bddfaf2c894031d9750282d69bf2103csewardj   MPI_Aint n;
461301a50f9bddfaf2c894031d9750282d69bf2103csewardj   r = PMPI_Type_extent(ty, &n);
462301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(r == MPI_SUCCESS);
463301a50f9bddfaf2c894031d9750282d69bf2103csewardj   return (long)n;
464301a50f9bddfaf2c894031d9750282d69bf2103csewardj}
465c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
466cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj/* Free up *ty, if it is safe to do so */
467301a50f9bddfaf2c894031d9750282d69bf2103csewardjstatic void maybeFreeTy ( MPI_Datatype* ty )
468301a50f9bddfaf2c894031d9750282d69bf2103csewardj{
469301a50f9bddfaf2c894031d9750282d69bf2103csewardj   int r, n_ints, n_addrs, n_dtys, tycon;
470c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
471301a50f9bddfaf2c894031d9750282d69bf2103csewardj   r = PMPI_Type_get_envelope( *ty, &n_ints, &n_addrs, &n_dtys, &tycon );
472301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(r == MPI_SUCCESS);
473c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
474cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   /* can't free named types */
475cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (tycon == MPI_COMBINER_NAMED)
476cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      return;
477cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj
478cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   /* some kinds of structs are predefined so we can't free them
479cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      either. */
480cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (*ty == MPI_FLOAT_INT || *ty == MPI_DOUBLE_INT
481cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj       || *ty == MPI_LONG_INT || *ty == MPI_2INT
482cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj       || *ty == MPI_SHORT_INT || *ty == MPI_LONG_DOUBLE_INT)
483cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      return;
484cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj
485cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   /* Looks OK - free it. */
486cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (0) {
487cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      /* show me what you're about to free .. */
488cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      fprintf(stderr, "freeing combiner ");
489cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      showCombiner(stderr,tycon);
490cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      fprintf(stderr, " ty= ");
491cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      showTy(stderr,*ty);
492cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      fprintf(stderr,"\n");
493301a50f9bddfaf2c894031d9750282d69bf2103csewardj   }
494cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   r = PMPI_Type_free(ty);
495cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   assert(r == MPI_SUCCESS);
496c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
497c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
4988717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj/* How big is a "named" (base) type?  Returns 0 if not known.  Note.
4998717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj   There is a subtlety, which is that this is required to return the
5008717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj   exact size of one item of the type, NOT the size of it when padded
5018717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj   suitably to make an array of them.  In particular that's why the
502cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   size of LONG_DOUBLE is computed by looking at the result of doing a
503cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   long double store, rather than just asking what is the sizeof(long
504cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   double).
505cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
506cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   For LONG_DOUBLE on x86-linux and amd64-linux my impression is that
507cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   the right answer is 10 even though sizeof(long double) says 12 and
508cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   16 respectively.  On ppc32-linux it appears to be 16.
5093f55c9c5458230180cfd74079c31e0409ba65976sewardj
5103f55c9c5458230180cfd74079c31e0409ba65976sewardj   Ref: MPI 1.1 doc p18 */
5118717d1a523a9e64ce934d83833a4c55e2bcf737dsewardjstatic long sizeofOneNamedTy ( MPI_Datatype ty )
5121646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj{
513cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_CHAR)           return sizeof(signed char);
514cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_SHORT)          return sizeof(signed short int);
515cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_INT)            return sizeof(signed int);
516cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_LONG)           return sizeof(signed long int);
517c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj   if (ty == MPI_UNSIGNED_CHAR)  return sizeof(unsigned char);
518c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj   if (ty == MPI_UNSIGNED_SHORT) return sizeof(unsigned short int);
519cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_UNSIGNED)       return sizeof(unsigned int);
520cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_UNSIGNED_LONG)  return sizeof(unsigned long int);
521cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_FLOAT)          return sizeof(float);
522cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_DOUBLE)         return sizeof(double);
523cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (ty == MPI_BYTE)           return 1;
524cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   if (ty == MPI_LONG_DOUBLE)    return sizeof_long_double_image();
525ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   if (ty == MPI_PACKED)         return 1;
526a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_LONG_LONG_INT)  return sizeof(signed long long int);
527cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
528443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_REAL8)
529a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_REAL8)          return 8; /* MPI2 spec */;
530443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
531443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_REAL4)
532a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_REAL4)          return 4; /* MPI2 spec */;
533a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
534a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_REAL)
535a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_REAL)           return 4; /* MPI2 spec */;
536443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
537443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_INTEGER8)
538a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_INTEGER8)       return 8; /* MPI2 spec */;
539443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
540443aa37437f8637e8842ada083a400c5578a2d8asewardj#  if defined(MPI_INTEGER4)
541a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_INTEGER4)       return 4; /* MPI2 spec */;
542a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
543a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_INTEGER)
544a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_INTEGER)        return 4; /* MPI2 spec */;
545443aa37437f8637e8842ada083a400c5578a2d8asewardj#  endif
546a8c487f6ba9811fdc483ff02925dd34f93be09basewardj#  if defined(MPI_DOUBLE_PRECISION)
547a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_DOUBLE_PRECISION) return 8; /* MPI2 spec */;
548a8c487f6ba9811fdc483ff02925dd34f93be09basewardj#  endif
549443aa37437f8637e8842ada083a400c5578a2d8asewardj
550cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   /* new in MPI2: */
551493743fe81c081d1ce3162ee01519fe450fbec8bsewardj#  if defined(MPI_WCHAR)
552a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_WCHAR)              return 2; /* MPI2 spec */;
553493743fe81c081d1ce3162ee01519fe450fbec8bsewardj#  endif
554493743fe81c081d1ce3162ee01519fe450fbec8bsewardj#  if defined(MPI_SIGNED_CHAR)
555a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_SIGNED_CHAR)        return 1; /* MPI2 spec */;
556493743fe81c081d1ce3162ee01519fe450fbec8bsewardj#  endif
557582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj#  if defined(MPI_UNSIGNED_LONG_LONG)
558a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_UNSIGNED_LONG_LONG) return 8; /* MPI2 spec */;
559a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
560a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_COMPLEX)
561a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_COMPLEX)            return 2 * 4; /* MPI2 spec */
562a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
563a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_DOUBLE_COMPLEX)
564a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_DOUBLE_COMPLEX)     return 2 * 8; /* MPI2 spec */
565582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj#  endif
566a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_LOGICAL)
567a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_LOGICAL)            return 4; /* MPI2 spec */
568a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
569a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2INTEGER)
570a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_2INTEGER)      return 2 * 4; /* undocumented in MPI2 */
571a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
572a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2COMPLEX)
573a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_2COMPLEX)      return 2 * 8; /* undocumented in MPI2 */
574a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
575a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2DOUBLE_COMPLEX)
576a7802967336adb950dcfb71f152759e45ea16e4bsewardj   /* 32: this is how openmpi-1.2.2 behaves on x86-linux, but I have
577a7802967336adb950dcfb71f152759e45ea16e4bsewardj      really no idea if this is right. */
578a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_2DOUBLE_COMPLEX)   return 32; /* undocumented in MPI2 */
579a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
580a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2REAL)
581a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_2REAL)              return 2 * 4; /* undocumented in MPI2 */
582a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
583a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_2DOUBLE_PRECISION)
584a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_2DOUBLE_PRECISION)  return 2 * 8; /* undocumented in MPI2 */
585a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
586a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  if defined(MPI_CHARACTER)
587a7802967336adb950dcfb71f152759e45ea16e4bsewardj   if (ty == MPI_CHARACTER)          return 1; /* MPI2 spec */
588a7802967336adb950dcfb71f152759e45ea16e4bsewardj#  endif
589a7802967336adb950dcfb71f152759e45ea16e4bsewardj
590cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   /* Note: the following are named structs, not named basic types,
591cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      and so are not handled here:
592cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         FLOAT_INT DOUBLE_INT LONG_INT 2INT SHORT_INT LONG_DOUBLE_INT
593cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      My guess is they are probably for doing max-w-index style
594cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      reductions, the INT carrying the index of the max/min and the
595cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      other type its actual value.
596cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   */
5971646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   return 0;
5981646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj}
5991646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
600c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
601cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj/* Find the size of long double image (not 'sizeof(long double)').
602cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   See comments in sizeofOneNamedTy.
603cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj*/
604cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardjstatic long sizeof_long_double_image ( void )
605cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj{
606cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   long i;
607cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   unsigned char* p;
608cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   static long cached_result = 0;
609cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
610cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   /* Hopefully we have it already. */
611cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   if (cached_result != 0) {
612cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      assert(cached_result == 10 || cached_result == 16 || cached_result == 8);
613cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      return cached_result;
614cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   }
615cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
616cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   /* No?  Then we'll have to compute it.  This isn't thread-safe but
617cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      it doesn't really matter since all races to compute it should
618cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      produce the same answer. */
619cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   p = malloc(64);
620cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   assert(p);
621cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   for (i = 0; i < 64; i++)
622cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      p[i] = 0x55;
623cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
624cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   /* Write a value which isn't known at compile time and therefore
625cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      must come out of a register.  If we just store a constant here,
626cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      some compilers write more data than a store from a machine
627cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      register would.  Therefore we have to force a store from a
628cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      machine register by storing a value which isn't known at compile
629cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      time.  Since getpid() will return a value < 1 million, turn it
630cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      into a zero by dividing by 1e+30. */
631cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   *(long double*)(&p[16]) = (long double)(1.0e-30 * (double)getpid());
632cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
633cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   for (i = 0; i < 16; i++) {
634cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      assert(p[i] == 0x55);
635cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      assert(p[i+48] == 0x55);
636cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   }
637cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   for (i = 16; i <= 48; i++) {
638cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      if (p[i] == 0x55)
639cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj         break;
640cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   }
641cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
642cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   assert(i < 48);
643cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   assert(i > 16);
644cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   free(p);
645cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   cached_result = i - 16;
646cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
647cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   if (0)
648cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj      printf("sizeof_long_double_image: computed %d\n", (int)cached_result);
649cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
650cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   assert(cached_result == 10 || cached_result == 16 || cached_result == 8);
651cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj   return cached_result;
652cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj}
653cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
654cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj
655301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/
656301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*--- Unpicking datatypes                                  ---*/
657301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/
658c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
659cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
660301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid walk_type_array ( void(*f)(void*,long), char* base,
661301a50f9bddfaf2c894031d9750282d69bf2103csewardj                       MPI_Datatype ty, long count );
662301a50f9bddfaf2c894031d9750282d69bf2103csewardj
663301a50f9bddfaf2c894031d9750282d69bf2103csewardj
664301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* Walk over all fragments of the object of type 'ty' with base
665301a50f9bddfaf2c894031d9750282d69bf2103csewardj   address 'base', and apply 'f' to the start/length of each
666301a50f9bddfaf2c894031d9750282d69bf2103csewardj   contiguous fragment. */
667301a50f9bddfaf2c894031d9750282d69bf2103csewardjstatic
668301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid walk_type ( void(*f)(void*,long), char* base, MPI_Datatype ty )
669c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
670301a50f9bddfaf2c894031d9750282d69bf2103csewardj   int  r, n_ints, n_addrs, n_dtys, tycon;
6711646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   long ex, i;
672301a50f9bddfaf2c894031d9750282d69bf2103csewardj   int*          ints  = NULL;
673301a50f9bddfaf2c894031d9750282d69bf2103csewardj   MPI_Aint*     addrs = NULL;
674301a50f9bddfaf2c894031d9750282d69bf2103csewardj   MPI_Datatype* dtys  = NULL;
675301a50f9bddfaf2c894031d9750282d69bf2103csewardj
676443aa37437f8637e8842ada083a400c5578a2d8asewardj   /* Stuff for limiting how much complaining text it spews out */
677443aa37437f8637e8842ada083a400c5578a2d8asewardj   static int complaints = 3;
678443aa37437f8637e8842ada083a400c5578a2d8asewardj   static int last_complained_about_tycon = -987654321; /* presumably bogus */
679443aa37437f8637e8842ada083a400c5578a2d8asewardj
6801646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   if (0)
681abbad834efb4e359020d79961c9214cac817aea5sewardj      printf("walk_type %p\n", (void*)(unsigned long)ty);
682301a50f9bddfaf2c894031d9750282d69bf2103csewardj
6839c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   r = PMPI_Type_get_envelope( ty, &n_ints, &n_addrs, &n_dtys, &tycon );
684301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(r == MPI_SUCCESS);
685301a50f9bddfaf2c894031d9750282d69bf2103csewardj
686301a50f9bddfaf2c894031d9750282d69bf2103csewardj   /* Handle the base cases fast(er/ish). */
687301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (tycon == MPI_COMBINER_NAMED) {
6888717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj      long sz = sizeofOneNamedTy(ty);
689cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      if (sz > 0) {
690cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         f(base, sz);
691cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         return;
692cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      }
693cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      /* Hmm.  Perhaps it's a named struct?  Unfortunately we can't
694cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         take them to bits so we have to do a really ugly hack, which
695cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         makes assumptions about how the MPI implementation has laid
696558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         out these types.  At least Open MPI 1.0.1 appears to put
697a7802967336adb950dcfb71f152759e45ea16e4bsewardj         the 'val' field first.  MPICH2 agrees.
698cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      */
699443aa37437f8637e8842ada083a400c5578a2d8asewardj      if (ty == MPI_2INT) {
700443aa37437f8637e8842ada083a400c5578a2d8asewardj         typedef struct { int val; int loc; } Ty;
701443aa37437f8637e8842ada083a400c5578a2d8asewardj         f(base + offsetof(Ty,val), sizeof(int));
702443aa37437f8637e8842ada083a400c5578a2d8asewardj         f(base + offsetof(Ty,loc), sizeof(int));
703443aa37437f8637e8842ada083a400c5578a2d8asewardj         return;
704443aa37437f8637e8842ada083a400c5578a2d8asewardj      }
705cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      if (ty == MPI_LONG_INT) {
706558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         typedef struct { long val; int loc; } Ty;
707558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         f(base + offsetof(Ty,val), sizeof(long));
708558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         f(base + offsetof(Ty,loc), sizeof(int));
709558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         return;
710558cc22cdc8bf09636d045f56faad79a9f62865bsewardj      }
711558cc22cdc8bf09636d045f56faad79a9f62865bsewardj      if (ty == MPI_DOUBLE_INT) {
712558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         typedef struct { double val; int loc; } Ty;
713558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         f(base + offsetof(Ty,val), sizeof(double));
714558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         f(base + offsetof(Ty,loc), sizeof(int));
715558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         return;
716558cc22cdc8bf09636d045f56faad79a9f62865bsewardj      }
717558cc22cdc8bf09636d045f56faad79a9f62865bsewardj      if (ty == MPI_SHORT_INT) {
718558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         typedef struct { short val; int loc; } Ty;
719558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         f(base + offsetof(Ty,val), sizeof(short));
720cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         f(base + offsetof(Ty,loc), sizeof(int));
721cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj         return;
722cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      }
723a7802967336adb950dcfb71f152759e45ea16e4bsewardj      if (ty == MPI_FLOAT_INT) {
724a7802967336adb950dcfb71f152759e45ea16e4bsewardj         typedef struct { float val; int loc; } Ty;
725a7802967336adb950dcfb71f152759e45ea16e4bsewardj         f(base + offsetof(Ty,val), sizeof(float));
726a7802967336adb950dcfb71f152759e45ea16e4bsewardj         f(base + offsetof(Ty,loc), sizeof(int));
727a7802967336adb950dcfb71f152759e45ea16e4bsewardj         return;
728a7802967336adb950dcfb71f152759e45ea16e4bsewardj      }
729a7802967336adb950dcfb71f152759e45ea16e4bsewardj      if (ty == MPI_LONG_DOUBLE_INT) {
730a7802967336adb950dcfb71f152759e45ea16e4bsewardj         typedef struct { long double val; int loc; } Ty;
731a7802967336adb950dcfb71f152759e45ea16e4bsewardj         f(base + offsetof(Ty,val), sizeof_long_double_image());
732a7802967336adb950dcfb71f152759e45ea16e4bsewardj         f(base + offsetof(Ty,loc), sizeof(int));
733a7802967336adb950dcfb71f152759e45ea16e4bsewardj         return;
734a7802967336adb950dcfb71f152759e45ea16e4bsewardj      }
735493743fe81c081d1ce3162ee01519fe450fbec8bsewardj      if (ty == MPI_LB || ty == MPI_UB)
736493743fe81c081d1ce3162ee01519fe450fbec8bsewardj         return; /* have zero size, so nothing needs to be done */
737cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      goto unhandled;
738301a50f9bddfaf2c894031d9750282d69bf2103csewardj      /*NOTREACHED*/
739c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
740c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
7411646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   if (0) {
742301a50f9bddfaf2c894031d9750282d69bf2103csewardj      ex = extentOfTy(ty);
743157a8c40575f4ce99c36a91434a43afd4db13717sewardj      printf("tycon 0x%llx %d %d %d (ext %d)\n",
744157a8c40575f4ce99c36a91434a43afd4db13717sewardj             (unsigned long long int)tycon,
745157a8c40575f4ce99c36a91434a43afd4db13717sewardj             n_ints, n_addrs, n_dtys, (int)ex );
746301a50f9bddfaf2c894031d9750282d69bf2103csewardj   }
747c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
748301a50f9bddfaf2c894031d9750282d69bf2103csewardj   /* Now safe to do MPI_Type_get_contents */
749301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(n_ints  >= 0);
750301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(n_addrs >= 0);
751301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(n_dtys  >= 0);
752c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
753301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (n_ints  > 0) {
754301a50f9bddfaf2c894031d9750282d69bf2103csewardj      ints = malloc(n_ints * sizeof(int));
755301a50f9bddfaf2c894031d9750282d69bf2103csewardj      assert(ints);
756301a50f9bddfaf2c894031d9750282d69bf2103csewardj   }
757301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (n_addrs > 0) {
758301a50f9bddfaf2c894031d9750282d69bf2103csewardj      addrs = malloc(n_addrs * sizeof(MPI_Aint));
759301a50f9bddfaf2c894031d9750282d69bf2103csewardj      assert(addrs);
760301a50f9bddfaf2c894031d9750282d69bf2103csewardj   }
761301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (n_dtys  > 0) {
762301a50f9bddfaf2c894031d9750282d69bf2103csewardj      dtys = malloc(n_dtys * sizeof(MPI_Datatype));
763301a50f9bddfaf2c894031d9750282d69bf2103csewardj      assert(dtys);
764c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
765c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
7669c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   r = PMPI_Type_get_contents( ty, n_ints, n_addrs, n_dtys,
7679c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                                   ints, addrs, dtys );
768301a50f9bddfaf2c894031d9750282d69bf2103csewardj   assert(r == MPI_SUCCESS);
769c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
770301a50f9bddfaf2c894031d9750282d69bf2103csewardj   switch (tycon) {
771c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
772301a50f9bddfaf2c894031d9750282d69bf2103csewardj      case MPI_COMBINER_CONTIGUOUS:
773301a50f9bddfaf2c894031d9750282d69bf2103csewardj         assert(n_ints == 1 && n_addrs == 0 && n_dtys == 1);
774301a50f9bddfaf2c894031d9750282d69bf2103csewardj	 walk_type_array( f, base, dtys[0], ints[0] );
775301a50f9bddfaf2c894031d9750282d69bf2103csewardj         maybeFreeTy( &dtys[0] );
776301a50f9bddfaf2c894031d9750282d69bf2103csewardj         break;
777301a50f9bddfaf2c894031d9750282d69bf2103csewardj
778c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj      case MPI_COMBINER_VECTOR:
779c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints == 3 && n_addrs == 0 && n_dtys == 1);
780c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         ex = extentOfTy(dtys[0]);
781c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         if (0)
782c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         printf("vector count %d x (bl %d stride %d)\n",
783c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                (int)ints[0], (int)ints[1], (int)ints[2]);
784c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         for (i = 0; i < ints[0]; i++) {
785c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            walk_type_array( f, base + i * ints[2]/*stride*/ * ex,
786c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                                dtys[0], ints[1]/*blocklength*/ );
787c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         }
788c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         maybeFreeTy( &dtys[0] );
789c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         break;
790c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj
791c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj      case MPI_COMBINER_HVECTOR:
792c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints == 2 && n_addrs == 1 && n_dtys == 1);
793c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         ex = extentOfTy(dtys[0]);
794c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         if (0)
795c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         printf("hvector count %d x (bl %d hstride %d)\n",
796c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                (int)ints[0], (int)ints[1], (int)addrs[0]);
797c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         for (i = 0; i < ints[0]; i++) {
798c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            walk_type_array( f, base + i * addrs[0]/*hstride*/,
799c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                                dtys[0], ints[1]/*blocklength*/ );
800c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         }
801c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         maybeFreeTy( &dtys[0] );
802c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         break;
803c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj
804c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj      case MPI_COMBINER_INDEXED:
805c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_addrs == 0 && n_dtys == 1);
806c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints > 0);
807c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints == 2 * ints[0] + 1);
808c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         ex = extentOfTy(dtys[0]);
809c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         for (i = 0; i < ints[0]; i++) {
810c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            if (0)
811c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            printf("indexed (elem %d) off %d copies %d\n",
812c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                   (int)i, ints[i+1+ints[0]], ints[i+1] );
813c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            walk_type_array( f, base + ex * ints[i+1+ints[0]],
814c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                                dtys[0], ints[i+1] );
815c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         }
816c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         maybeFreeTy( &dtys[0] );
817c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         break;
818c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj
819c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj      case MPI_COMBINER_HINDEXED:
820c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints > 0);
821c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints == ints[0] + 1);
822c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_addrs == ints[0] && n_dtys == 1);
823c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         ex = extentOfTy(dtys[0]);
824c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         for (i = 0; i < ints[0]; i++) {
825c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            if (0)
826c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            printf("hindexed (elem %d) hoff %d copies %d\n",
827c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                   (int)i, (int)addrs[i], ints[i+1] );
828c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            walk_type_array( f, base + addrs[i],
829c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj                                dtys[0], ints[i+1] );
830c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         }
831c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         maybeFreeTy( &dtys[0] );
832c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         break;
833c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj
834301a50f9bddfaf2c894031d9750282d69bf2103csewardj      case MPI_COMBINER_STRUCT:
835301a50f9bddfaf2c894031d9750282d69bf2103csewardj         assert(n_addrs == n_ints-1);
836301a50f9bddfaf2c894031d9750282d69bf2103csewardj         assert(n_dtys  == n_ints-1);
837c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints > 0);
838c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj         assert(n_ints == ints[0] + 1);
839301a50f9bddfaf2c894031d9750282d69bf2103csewardj	 for (i = 0; i < ints[0]; i++) {
8401646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj            if (0)
841c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj            printf("struct (elem %d limit %d) hoff %d copies %d\n",
842301a50f9bddfaf2c894031d9750282d69bf2103csewardj                   (int)i, (int)ints[0], (int)addrs[i], (int)ints[i+1]);
843301a50f9bddfaf2c894031d9750282d69bf2103csewardj            walk_type_array( f, base + addrs[i], dtys[i], (long)ints[i+1] );
844301a50f9bddfaf2c894031d9750282d69bf2103csewardj            maybeFreeTy( &dtys[i] );
845301a50f9bddfaf2c894031d9750282d69bf2103csewardj	 }
846301a50f9bddfaf2c894031d9750282d69bf2103csewardj         break;
847301a50f9bddfaf2c894031d9750282d69bf2103csewardj
848301a50f9bddfaf2c894031d9750282d69bf2103csewardj      default:
849301a50f9bddfaf2c894031d9750282d69bf2103csewardj         goto unhandled;
850301a50f9bddfaf2c894031d9750282d69bf2103csewardj
851301a50f9bddfaf2c894031d9750282d69bf2103csewardj   }
852301a50f9bddfaf2c894031d9750282d69bf2103csewardj
853301a50f9bddfaf2c894031d9750282d69bf2103csewardj   /* normal exit */
854301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (ints)  free(ints);
855301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (addrs) free(addrs);
856301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (dtys)  free(dtys);
857301a50f9bddfaf2c894031d9750282d69bf2103csewardj   return;
858301a50f9bddfaf2c894031d9750282d69bf2103csewardj
859301a50f9bddfaf2c894031d9750282d69bf2103csewardj  unhandled:
860443aa37437f8637e8842ada083a400c5578a2d8asewardj   /* Complain, but limit the amount of complaining that can happen to
861443aa37437f8637e8842ada083a400c5578a2d8asewardj      the first 3 different unhandled tycons that show up, so as to
862443aa37437f8637e8842ada083a400c5578a2d8asewardj      avoid swamping users with thousands of duplicate messages. */
863443aa37437f8637e8842ada083a400c5578a2d8asewardj   if (complaints > 0 && tycon != last_complained_about_tycon) {
864443aa37437f8637e8842ada083a400c5578a2d8asewardj      complaints--;
865443aa37437f8637e8842ada083a400c5578a2d8asewardj      last_complained_about_tycon = tycon;
866443aa37437f8637e8842ada083a400c5578a2d8asewardj      if (tycon == MPI_COMBINER_NAMED) {
867443aa37437f8637e8842ada083a400c5578a2d8asewardj         fprintf(stderr, "%s %5d: walk_type: unhandled base type 0x%lx ",
868443aa37437f8637e8842ada083a400c5578a2d8asewardj                         preamble, my_pid, (long)ty);
869443aa37437f8637e8842ada083a400c5578a2d8asewardj         showTy(stderr, ty);
870443aa37437f8637e8842ada083a400c5578a2d8asewardj         fprintf(stderr, "\n");
871443aa37437f8637e8842ada083a400c5578a2d8asewardj      } else {
872443aa37437f8637e8842ada083a400c5578a2d8asewardj         fprintf(stderr, "%s %5d: walk_type: unhandled combiner 0x%lx\n",
873443aa37437f8637e8842ada083a400c5578a2d8asewardj                         preamble, my_pid, (long)tycon);
874443aa37437f8637e8842ada083a400c5578a2d8asewardj      }
875c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
876301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (ints)  free(ints);
877301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (addrs) free(addrs);
878301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (dtys)  free(dtys);
879cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   if (opt_missing >= 2)
880cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj      barf("walk_type: unhandled combiner, strict checking selected");
881c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
882c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
883301a50f9bddfaf2c894031d9750282d69bf2103csewardj
884cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj/* Same as walk_type but apply 'f' to every element in an array of
885cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   'count' items starting at 'base'.  The only purpose of pushing this
886cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   into a different routine is so it can attempt to optimise the case
887cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   where the array elements are contiguous and packed together without
888cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   holes. */
889cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
890301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid walk_type_array ( void(*f)(void*,long), char* base,
891301a50f9bddfaf2c894031d9750282d69bf2103csewardj                       MPI_Datatype elemTy, long count )
892c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
893301a50f9bddfaf2c894031d9750282d69bf2103csewardj   long i, ex;
8941646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
8951646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   assert(sizeof(unsigned long) == sizeof(char*));
8961646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
8971646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   /* First see if we can do this the fast way. */
8988717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj   ex = sizeofOneNamedTy(elemTy);
8991646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
9001646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   if ( /* ty is a primitive type with power-of-2 size */
9011646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj        (ex == 8 || ex == 4 || ex == 2 || ex == 1)
9021646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj        && /* base is suitably aligned for ty */
9031646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj           ( ((unsigned long)base) & (ex-1)) == 0)  {
9041646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
9051646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj      /* We're sure it's contiguous, so just paint/check it in one
9061646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj         go. */
9071646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj     if (0) printf("walk_type_array fast %ld of size %ld\n", count, ex );
9081646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj     f ( base, count * ex );
9091646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
9101646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   } else {
9111646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
9121646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj      /* Bad news.  We have to futz with each element individually.
9138717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj         This could be very expensive.
9148717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj
9158717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj         Note: subtle.  If ty is LONG_DOUBLE then the extent will be
9168717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj         12, so the following loop will jump along in steps of 12, but
9178717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj         the size painted by walk_type will be 10 since it uses
9188717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj         sizeofOneNamedTy to establish the size of base types.  Which
9198717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj         is what we need to happen. */
9201646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj      ex = extentOfTy(elemTy);
9211646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj      if (0) printf("walk_type_array SLOW %ld of size %ld\n", count, ex );
9221646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj      for (i = 0; i < count; i++)
9231646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj         walk_type( f, base + i * ex, elemTy );
9241646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj
9251646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj   }
926c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
927c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
928c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
929558cc22cdc8bf09636d045f56faad79a9f62865bsewardj/* Hook so it's visible from outside (can be handy to dlopen/dlsym
930558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   it) */
931558cc22cdc8bf09636d045f56faad79a9f62865bsewardjvoid mpiwrap_walk_type_EXTERNALLY_VISIBLE
932c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj    ( void(*f)(void*,long), char* base, MPI_Datatype ty )
933c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj{
934d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj   walk_type(f, base, ty);
935c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj}
936c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj
937c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj
938301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/
939301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*--- Address-range helpers                                ---*/
940301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/
941301a50f9bddfaf2c894031d9750282d69bf2103csewardj
942c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ----------------
943c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Do corresponding checks on memory areas defined using a
944cf375348308c3b81dca2864898772c4d2ac2ee76sewardj   straightforward (start, length) description.
945c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ----------------
946c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
947c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
948cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
949dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_defined_untyped ( void* buffer, long nbytes )
950c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
951c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (nbytes > 0) {
952dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      VALGRIND_CHECK_MEM_IS_DEFINED(buffer, nbytes);
953c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
954c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
955c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
956cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
957dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_addressable_untyped ( void* buffer, long nbytes )
958c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
959c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (nbytes > 0) {
960dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      VALGRIND_CHECK_MEM_IS_ADDRESSABLE(buffer, nbytes);
961c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
962c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
963c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
964cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
965dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid make_mem_defined_if_addressable_untyped ( void* buffer, long nbytes )
966c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
967c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (nbytes > 0) {
968dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(buffer, nbytes);
969c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
970c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
971c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
972cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
973dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid make_mem_defined_if_addressable_if_success_untyped ( int err,
974cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj                                       void* buffer, long nbytes )
975c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
976c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS && nbytes > 0) {
977dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(buffer, nbytes);
978c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
979c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
980c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
981c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
982301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* ----------------
983301a50f9bddfaf2c894031d9750282d69bf2103csewardj   Do checks on memory areas defined using the MPI (buffer, count,
984301a50f9bddfaf2c894031d9750282d69bf2103csewardj   type) convention.
985301a50f9bddfaf2c894031d9750282d69bf2103csewardj   ----------------
986301a50f9bddfaf2c894031d9750282d69bf2103csewardj*/
987301a50f9bddfaf2c894031d9750282d69bf2103csewardj
988301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* Check that the specified area is both addressible and contains
989301a50f9bddfaf2c894031d9750282d69bf2103csewardj   initialised data, and cause V to complain if not. */
990301a50f9bddfaf2c894031d9750282d69bf2103csewardj
991cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
992dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_defined ( char* buffer, long count, MPI_Datatype datatype )
993301a50f9bddfaf2c894031d9750282d69bf2103csewardj{
994dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   walk_type_array( check_mem_is_defined_untyped, buffer, datatype, count );
995301a50f9bddfaf2c894031d9750282d69bf2103csewardj}
996301a50f9bddfaf2c894031d9750282d69bf2103csewardj
997301a50f9bddfaf2c894031d9750282d69bf2103csewardj
998301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* Check that the specified area is addressible, and cause V to
999301a50f9bddfaf2c894031d9750282d69bf2103csewardj   complain if not. Doesn't matter whether the data there is
1000301a50f9bddfaf2c894031d9750282d69bf2103csewardj   initialised or not. */
1001301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1002cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
1003dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_addressable ( void *buffer, long count, MPI_Datatype datatype )
1004301a50f9bddfaf2c894031d9750282d69bf2103csewardj{
1005dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   walk_type_array( check_mem_is_addressable_untyped, buffer, datatype, count );
1006301a50f9bddfaf2c894031d9750282d69bf2103csewardj}
1007301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1008301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1009cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj/* Set the specified area to 'defined for each byte which is
1010cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj   addressible' state. */
1011301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1012cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
1013dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid make_mem_defined_if_addressable ( void *buffer, int count, MPI_Datatype datatype )
1014301a50f9bddfaf2c894031d9750282d69bf2103csewardj{
1015dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   walk_type_array( make_mem_defined_if_addressable_untyped,
1016dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn                    buffer, datatype, count );
1017301a50f9bddfaf2c894031d9750282d69bf2103csewardj}
1018301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1019cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
1020301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid
1021dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnmake_mem_defined_if_addressable_if_success ( int err, void *buffer, int count,
1022dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn                                             MPI_Datatype datatype )
1023301a50f9bddfaf2c894031d9750282d69bf2103csewardj{
1024301a50f9bddfaf2c894031d9750282d69bf2103csewardj   if (err == MPI_SUCCESS)
1025dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable(buffer, count, datatype);
1026301a50f9bddfaf2c894031d9750282d69bf2103csewardj}
1027301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1028301a50f9bddfaf2c894031d9750282d69bf2103csewardj
1029c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1030c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1031c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- The wrappers proper.   They are listed in the order  ---*/
1032c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- in which they appear in "MPI: A Message-Passing      ---*/
1033c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Interface Standard, MPIF, Nov 15 2003" (the MPI 1.1  ---*/
1034c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- spec.  All unimplemented wrappers are listed at the  ---*/
1035c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- end of the file.  The list of function names is      ---*/
10369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/*--- taken from the headers of Open MPI svn r9191.        ---*/
10379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/*--- Hopefully it is a complete list of all the MPI 2     ---*/
10389c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/*--- functions.                                           ---*/
1039c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1040c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1041c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1042c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Handy abbreviation */
1043c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#define WRAPPER_FOR(name) I_WRAP_FNNAME_U(name)
1044c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1045c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Generates (conceptually) a wrapper which does nothing.  In
1046c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   fact just generate no wrapper at all. */
10479c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj#define HAS_NO_WRAPPER(basename) /* */
1048c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1049c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1050c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1051c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1052c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.2, Blocking Send and Receive Operations        ---*/
1053c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1054c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1055c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
10569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- {,B,S,R}Send --- */
1057c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: rd: (buf,count,datatype) */
10589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjstatic
10599c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint generic_Send(void *buf, int count, MPI_Datatype datatype,
10609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                            int dest, int tag, MPI_Comm comm)
1061c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1062c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
1063c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
1064c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
10659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("{,B,S,R}Send");
1066dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(buf, count, datatype);
1067dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1068c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_6W(err, fn, buf,count,datatype,dest,tag,comm);
1069dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
10709c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("{,B,S,R}Send", err);
1071c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1072c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
10739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Send)(void *buf, int count, MPI_Datatype datatype,
10749c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                           int dest, int tag, MPI_Comm comm) {
10759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Send(buf,count,datatype, dest,tag,comm);
10769c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
10779c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Bsend)(void *buf, int count, MPI_Datatype datatype,
10789c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                            int dest, int tag, MPI_Comm comm) {
10799c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Send(buf,count,datatype, dest,tag,comm);
10809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
10819c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Ssend)(void *buf, int count, MPI_Datatype datatype,
10829c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                            int dest, int tag, MPI_Comm comm) {
10839c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Send(buf,count,datatype, dest,tag,comm);
10849c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
10859c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Rsend)(void *buf, int count, MPI_Datatype datatype,
10869c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                            int dest, int tag, MPI_Comm comm) {
10879c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Send(buf,count,datatype, dest,tag,comm);
10889c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
1089c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1090c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Recv --- */
1091c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre:  must be writable: (buf,count,datatype)
1092c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         must be writable: status
1093c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   post: make readable: (buf,recv_count,datatype)
1094c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         where recv_count is determined from *status
1095c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
1096c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Recv)(void *buf, int count, MPI_Datatype datatype,
1097c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                           int source, int tag,
1098c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                           MPI_Comm comm, MPI_Status *status)
1099c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1100753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   OrigFn     fn;
1101753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   int        err, recv_count = 0;
1102753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status fake_status;
1103c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1104c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Recv");
1105753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1106753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1107dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable(buf, count, datatype);
1108dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(status, sizeof(*status));
1109dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1110c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_7W(err, fn, buf,count,datatype,source,tag,comm,status);
1111dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
111226c60a8706eb45cbf303437adc87e313e104d4efsewardj   make_mem_defined_if_addressable_if_success_untyped(err, status, sizeof(*status));
1113c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS && count_from_Status(&recv_count,datatype,status)) {
1114dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable(buf, recv_count, datatype);
1115c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1116c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Recv", err);
1117c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1118c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1119c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
11209c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Get_count --- */
11219c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* pre:  must be readable: *status
11229c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   post: make defined: *count -- don't bother, libmpi will surely do this
11239c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj*/
11249c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Get_count)(MPI_Status* status,
11259c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                                MPI_Datatype ty, int* count )
11269c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
11279c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   OrigFn fn;
11289c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int    err;
11299c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   VALGRIND_GET_ORIG_FN(fn);
11309c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("Get_count");
1131dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined_untyped(status, sizeof(*status));
1132dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
11339c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   CALL_FN_W_WWW(err, fn, status,ty,count);
1134dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
11359c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("Get_count", err);
11369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return err;
11379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
11389c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
1139c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1140c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1141c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1142c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.7, Nonblocking communication                   ---*/
1143c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1144c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1145c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
11469c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Maintain a table that makes it possible for the wrappers to
11479c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   complete MPI_Irecv successfully.
11489c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
11499c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   The issue is that MPI_Irecv states the recv buffer and returns
11509c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   immediately, giving a handle (MPI_Request) for the transaction.
11519c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   Later the user will have to poll for completion with MPI_Wait etc,
11529c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   and at that point these wrappers have to paint the recv buffer.
11539c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   But the recv buffer details are not presented to MPI_Wait - only
11549c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   the handle is.  We therefore have to use a shadow table
11559c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   (sReqs{,_size,_used,_lock}) which associates uncompleted
11569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   MPI_Requests with the corresponding buffer address/count/type.
11579c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
11589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   Only read requests are placed in the table, since there is no need
11599c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   to do any buffer painting following completion of an Isend - all
11609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   the checks for that are done at the time Isend is called.
11619c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
11629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   Care has to be take to remove completed requests from the table.
11639c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
11649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   Access to the table is guarded by sReqs_lock so as to make it
11659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   thread-safe.
11669c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj*/
11679c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
1168c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjtypedef
1169c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   struct {
1170c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      Bool         inUse;
1171c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      MPI_Request  key;
1172c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      void*        buf;
1173c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      int          count;
1174c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      MPI_Datatype datatype;
1175c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1176c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ShadowRequest;
1177c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1178c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic ShadowRequest*  sReqs      = NULL;
1179c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic int             sReqs_size = 0;
1180c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic int             sReqs_used = 0;
1181558cc22cdc8bf09636d045f56faad79a9f62865bsewardjstatic pthread_mutex_t sReqs_lock = PTHREAD_MUTEX_INITIALIZER;
1182558cc22cdc8bf09636d045f56faad79a9f62865bsewardj
1183558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#define LOCK_SREQS                                  \
1184558cc22cdc8bf09636d045f56faad79a9f62865bsewardj  do { int pr = pthread_mutex_lock(&sReqs_lock);    \
1185558cc22cdc8bf09636d045f56faad79a9f62865bsewardj       assert(pr == 0);                             \
1186558cc22cdc8bf09636d045f56faad79a9f62865bsewardj  } while (0)
1187558cc22cdc8bf09636d045f56faad79a9f62865bsewardj
1188558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#define UNLOCK_SREQS                                \
1189558cc22cdc8bf09636d045f56faad79a9f62865bsewardj  do { int pr = pthread_mutex_unlock(&sReqs_lock);  \
1190558cc22cdc8bf09636d045f56faad79a9f62865bsewardj       assert(pr == 0);                             \
1191558cc22cdc8bf09636d045f56faad79a9f62865bsewardj  } while (0)
1192c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1193c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1194c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Ensure the sReqs expandable array has at least one free slot, by
1195c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   copying it into a larger one if necessary.  NOTE: sReqs_lock is
1196c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   held throughout this procedure.*/
1197c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void ensure_sReq_space ( void )
1198c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1199c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int            i;
1200c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ShadowRequest* sReqs2;
1201c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (sReqs_used == sReqs_size) {
1202c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      sReqs_size = sReqs_size==0 ? 2 : 2*sReqs_size;
1203c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      sReqs2 = malloc( sReqs_size * sizeof(ShadowRequest) );
1204c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (sReqs2 == NULL) {
1205558cc22cdc8bf09636d045f56faad79a9f62865bsewardj         UNLOCK_SREQS;
1206c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         barf("add_shadow_Request: malloc failed.\n");
1207c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1208c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      for (i = 0; i < sReqs_used; i++)
1209c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         sReqs2[i] = sReqs[i];
1210c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (sReqs)
1211c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         free(sReqs);
1212c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      sReqs = sReqs2;
1213c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1214c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   assert(sReqs_used < sReqs_size);
1215c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1216c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1217c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1218c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Find shadow info for 'request', or NULL if none. */
1219c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1220c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic
1221c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjShadowRequest* find_shadow_Request ( MPI_Request request )
1222c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1223c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ShadowRequest* ret = NULL;
1224c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int i;
1225558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   LOCK_SREQS;
1226c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   for (i = 0; i < sReqs_used; i++) {
1227c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) {
1228c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         ret = &sReqs[i];
1229c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         break;
1230c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1231c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1232558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   UNLOCK_SREQS;
1233c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return ret;
1234c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1235c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1236c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1237c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Delete shadow info for 'request', if any. */
1238c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1239c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void delete_shadow_Request ( MPI_Request request )
1240c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1241c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int i;
1242558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   LOCK_SREQS;
1243c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   for (i = 0; i < sReqs_used; i++) {
1244c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) {
1245c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         sReqs[i].inUse = False;
1246c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         break;
1247c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1248c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1249558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   UNLOCK_SREQS;
1250c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1251c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1252c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1253c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Add a shadow for 'request', overwriting any old binding for it. */
1254c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1255c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic
1256c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjvoid add_shadow_Request( MPI_Request request,
1257c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         void* buf, int count,
1258c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         MPI_Datatype datatype )
1259c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1260c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int i, ix = -1;
1261558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   LOCK_SREQS;
1262c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   assert(sReqs_used >= 0);
1263c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   assert(sReqs_size >= 0);
1264c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   assert(sReqs_used <= sReqs_size);
1265c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (sReqs == NULL) assert(sReqs_size == 0);
1266c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1267c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   /* First of all see if we already have a binding for this key; if
1268c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      so just replace it, and have done. */
1269c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   for (i = 0; i < sReqs_used; i++) {
1270c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) {
1271c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         ix = i;
1272c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         break;
1273c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1274c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1275c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1276c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (ix < 0) {
1277c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      /* Ok, we don't have it, so will have to add it.  First search
1278c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         to see if there is an existing empty slot. */
1279c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      for (i = 0; i < sReqs_used; i++) {
1280c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         if (!sReqs[i].inUse) {
1281c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj            ix = i;
1282c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj            break;
1283c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         }
1284c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1285c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1286c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1287c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   /* No empty slots.  Allocate a new one. */
1288c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (ix < 0) {
1289c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      ensure_sReq_space();
1290c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      assert(sReqs_used < sReqs_size);
1291c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      ix = sReqs_used;
1292c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      sReqs_used++;
1293c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1294c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1295c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   assert(ix >= 0 && ix < sReqs_used);
1296c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   assert(sReqs_used <= sReqs_size);
1297c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1298c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sReqs[ix].inUse    = True;
1299c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sReqs[ix].key      = request;
1300c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sReqs[ix].buf      = buf;
1301c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sReqs[ix].count    = count;
1302c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sReqs[ix].datatype = datatype;
1303c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1304558cc22cdc8bf09636d045f56faad79a9f62865bsewardj   UNLOCK_SREQS;
1305ec8b614219f9746385ee7d0bc20e209302713f68sewardj   if (opt_verbosity > 1)
1306c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      fprintf(stderr, "%s %5d: sReq+ 0x%lx -> b/c/d %p/%d/0x%lx [slot %d]\n",
1307c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                      preamble, my_pid, (unsigned long)request,
1308c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                buf, count, (long)datatype, ix);
1309c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1310c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
13119c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjstatic
13129c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjMPI_Request* clone_Request_array ( int count, MPI_Request* orig )
13139c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
13149c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   MPI_Request* copy;
13159c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int i;
13169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   LOCK_SREQS;
13179c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   if (count < 0)
13189c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj      count = 0; /* Hmm.  Call Mulder and Scully. */
13199c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   copy = malloc( count * sizeof(MPI_Request) );
1320d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj   if (copy == NULL && count > 0) {
13219c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj      UNLOCK_SREQS;
13229c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj      barf("clone_Request_array: malloc failed");
13239c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   }
13249c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   for (i = 0; i < count; i++)
13259c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj      copy[i] = orig[i];
13269c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   UNLOCK_SREQS;
13279c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return copy;
13289c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
13299c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
1330558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#undef LOCK_SREQS
1331558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#undef UNLOCK_SREQS
1332c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
13339c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
1334c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void maybe_complete ( Bool         error_in_status,
1335c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             MPI_Request  request_before,
1336c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             MPI_Request  request_after,
1337c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             MPI_Status*  status )
1338c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1339c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int recv_count = 0;
1340c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   ShadowRequest* shadow;
1341c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   /* How do we know if this is an Irecv request that has now
1342c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      finished successfully?
1343c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1344c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      request_before isn't MPI_REQUEST_NULL
1345c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      and request_before is found in the shadow table
1346c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      and request_after *is* MPI_REQUEST_NULL
1347c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      and (if error_in_status then status.MPI_ERROR is MPI_SUCCESS)
1348c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1349c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      (when error_in_status == False, then we expect not to get
1350c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      called at all if there was an error.)
1351c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   */
1352c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (request_before != MPI_REQUEST_NULL
1353c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       && request_after == MPI_REQUEST_NULL
1354c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       && (error_in_status ? status->MPI_ERROR == MPI_SUCCESS : True)
1355c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       && ( (shadow=find_shadow_Request(request_before)) != NULL) ) {
1356b727b54c51af958caadd4ef1736b22ce59607eebsewardj      /* The Irecv detailed in 'shadow' completed.  Paint the result
1357b727b54c51af958caadd4ef1736b22ce59607eebsewardj         buffer, and delete the entry. */
1358c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (count_from_Status(&recv_count, shadow->datatype, status)) {
1359dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn         make_mem_defined_if_addressable(shadow->buf, recv_count, shadow->datatype);
1360ec8b614219f9746385ee7d0bc20e209302713f68sewardj         if (opt_verbosity > 1)
1361c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj            fprintf(stderr, "%s %5d: sReq- %p (completed)\n",
1362c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                            preamble, my_pid, request_before);
1363c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1364c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      delete_shadow_Request(request_before);
1365c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1366c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1367c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1368c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1369c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Isend --- */
1370c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: (buf,count,datatype) */
1371c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* wr: *request */
1372cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__
13739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint generic_Isend(void *buf, int count, MPI_Datatype datatype,
13749c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             int dest, int tag, MPI_Comm comm,
13759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             MPI_Request* request)
1376c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1377c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
1378c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
1379c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
13809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("{,B,S,R}Isend");
1381dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(buf, count, datatype);
1382dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(request, sizeof(*request));
1383dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1384c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_7W(err, fn, buf,count,datatype,dest,tag,comm,request);
1385dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1386dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success_untyped(err, request, sizeof(*request));
13879c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("{,B,S,R}Isend", err);
1388c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1389c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
13909c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Isend)(void *buf, int count, MPI_Datatype datatype,
13919c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                            int dest, int tag, MPI_Comm comm,
13929c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                            MPI_Request* request) {
13939c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Isend(buf,count,datatype, dest,tag,comm, request);
13949c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
13959c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Ibsend)(void *buf, int count, MPI_Datatype datatype,
13969c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             int dest, int tag, MPI_Comm comm,
13979c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             MPI_Request* request) {
13989c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Isend(buf,count,datatype, dest,tag,comm, request);
13999c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
14009c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Issend)(void *buf, int count, MPI_Datatype datatype,
14019c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             int dest, int tag, MPI_Comm comm,
14029c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             MPI_Request* request) {
14039c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Isend(buf,count,datatype, dest,tag,comm, request);
14049c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
14059c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Irsend)(void *buf, int count, MPI_Datatype datatype,
14069c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             int dest, int tag, MPI_Comm comm,
14079c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                             MPI_Request* request) {
14089c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return generic_Isend(buf,count,datatype, dest,tag,comm, request);
14099c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
14109c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
1411c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1412c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Irecv --- */
1413c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre:  must be writable: (buf,count,datatype), *request
1414c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   post: make readable *request
1415c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         add a request->(buf,count,ty) binding to the
1416c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         shadow request table.
1417c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
1418c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Irecv)( void* buf, int count, MPI_Datatype datatype,
1419c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             int source, int tag, MPI_Comm comm,
1420c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             MPI_Request* request )
1421c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1422c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
1423c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
1424c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1425c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Irecv");
1426dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable(buf, count, datatype);
1427dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(request, sizeof(*request));
1428dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1429c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_7W(err, fn, buf,count,datatype,source,tag,comm,request);
1430dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1431c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS) {
1432dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable_untyped(request, sizeof(*request));
1433c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      add_shadow_Request( *request, buf,count,datatype );
1434c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1435c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Irecv", err);
1436c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1437c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1438c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1439c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Wait --- */
1440b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* The MPI1 spec (imprecisely) defines 3 request states:
1441b727b54c51af958caadd4ef1736b22ce59607eebsewardj   - "null"     if the request is MPI_REQUEST_NULL
1442b727b54c51af958caadd4ef1736b22ce59607eebsewardj   - "inactive" if not "null" and not associated with ongoing comms
1443b727b54c51af958caadd4ef1736b22ce59607eebsewardj   - "active"   if not "null" and is associated with ongoing comms
1444b727b54c51af958caadd4ef1736b22ce59607eebsewardj*/
1445c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Wait)( MPI_Request* request,
1446c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                            MPI_Status* status )
1447c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1448c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   MPI_Request  request_before;
1449753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status   fake_status;
1450c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn       fn;
1451c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int          err;
1452c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1453c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Wait");
1454753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1455753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1456dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(status, sizeof(MPI_Status));
1457dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined_untyped(request, sizeof(MPI_Request));
1458c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   request_before = *request;
1459dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1460c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_WW(err, fn, request,status);
1461dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1462c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS) {
1463c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      maybe_complete(False/*err in status?*/,
1464c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                     request_before, *request, status);
1465dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable_untyped(status, sizeof(MPI_Status));
1466c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1467c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Wait", err);
1468c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1469c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1470c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1471982751b29b4fe1623a8ce3504004b567f27a2b5csewardj/* --- Waitany --- */
1472982751b29b4fe1623a8ce3504004b567f27a2b5csewardjint WRAPPER_FOR(PMPI_Waitany)( int count,
1473982751b29b4fe1623a8ce3504004b567f27a2b5csewardj                               MPI_Request* requests,
1474982751b29b4fe1623a8ce3504004b567f27a2b5csewardj                               int* index,
1475982751b29b4fe1623a8ce3504004b567f27a2b5csewardj                               MPI_Status* status )
1476982751b29b4fe1623a8ce3504004b567f27a2b5csewardj{
1477982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   MPI_Request* requests_before = NULL;
1478753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status   fake_status;
1479982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   OrigFn       fn;
1480982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   int          err, i;
1481982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   VALGRIND_GET_ORIG_FN(fn);
1482982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   before("Waitany");
1483753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1484753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1485982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   if (0) fprintf(stderr, "Waitany: %d\n", count);
1486982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   check_mem_is_addressable_untyped(index, sizeof(int));
1487982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   check_mem_is_addressable_untyped(status, sizeof(MPI_Status));
1488982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   for (i = 0; i < count; i++) {
1489982751b29b4fe1623a8ce3504004b567f27a2b5csewardj      check_mem_is_defined_untyped(&requests[i], sizeof(MPI_Request));
1490982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   }
1491982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   requests_before = clone_Request_array( count, requests );
1492dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1493982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   CALL_FN_W_WWWW(err, fn, count,requests,index,status);
1494dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1495982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   if (err == MPI_SUCCESS && *index >= 0 && *index < count) {
1496982751b29b4fe1623a8ce3504004b567f27a2b5csewardj      maybe_complete(False/*err in status?*/,
1497982751b29b4fe1623a8ce3504004b567f27a2b5csewardj                     requests_before[*index], requests[*index], status);
1498982751b29b4fe1623a8ce3504004b567f27a2b5csewardj      make_mem_defined_if_addressable_untyped(status, sizeof(MPI_Status));
1499982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   }
1500982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   if (requests_before)
1501982751b29b4fe1623a8ce3504004b567f27a2b5csewardj      free(requests_before);
1502982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   after("Waitany", err);
1503982751b29b4fe1623a8ce3504004b567f27a2b5csewardj   return err;
1504982751b29b4fe1623a8ce3504004b567f27a2b5csewardj}
1505982751b29b4fe1623a8ce3504004b567f27a2b5csewardj
1506c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Waitall --- */
1507c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Waitall)( int count,
1508c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                               MPI_Request* requests,
1509c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                               MPI_Status* statuses )
1510c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1511c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   MPI_Request* requests_before = NULL;
1512c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn       fn;
1513c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int          err, i;
1514753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   Bool         free_sta = False;
1515c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1516c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Waitall");
1517c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (0) fprintf(stderr, "Waitall: %d\n", count);
1518753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(statuses)) {
1519753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      free_sta = True;
1520753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      statuses = malloc( (count < 0 ? 0 : count) * sizeof(MPI_Status) );
1521753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   }
1522c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   for (i = 0; i < count; i++) {
1523dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_addressable_untyped(&statuses[i], sizeof(MPI_Status));
1524dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_defined_untyped(&requests[i], sizeof(MPI_Request));
1525c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1526c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   requests_before = clone_Request_array( count, requests );
1527dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1528c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_WWW(err, fn, count,requests,statuses);
1529dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1530c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS /*complete success*/
1531c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       || err == MPI_ERR_IN_STATUS /* partial success */) {
1532c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      Bool e_i_s = err == MPI_ERR_IN_STATUS;
1533c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      for (i = 0; i < count; i++) {
1534c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         maybe_complete(e_i_s, requests_before[i], requests[i],
1535c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                               &statuses[i]);
1536dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn         make_mem_defined_if_addressable_untyped(&statuses[i],
1537dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn                                                 sizeof(MPI_Status));
1538c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      }
1539c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1540c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (requests_before)
1541c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      free(requests_before);
1542753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (free_sta)
1543753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      free(statuses);
1544c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Waitall", err);
1545c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1546c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1547c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1548b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Test --- */
1549b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* nonblocking version of Wait */
1550b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Test)( MPI_Request* request, int* flag,
1551b727b54c51af958caadd4ef1736b22ce59607eebsewardj                            MPI_Status* status )
1552b727b54c51af958caadd4ef1736b22ce59607eebsewardj{
1553b727b54c51af958caadd4ef1736b22ce59607eebsewardj   MPI_Request  request_before;
1554753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status   fake_status;
1555b727b54c51af958caadd4ef1736b22ce59607eebsewardj   OrigFn       fn;
1556b727b54c51af958caadd4ef1736b22ce59607eebsewardj   int          err;
1557b727b54c51af958caadd4ef1736b22ce59607eebsewardj   VALGRIND_GET_ORIG_FN(fn);
1558b727b54c51af958caadd4ef1736b22ce59607eebsewardj   before("Test");
1559753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1560753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1561dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(status, sizeof(MPI_Status));
1562dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(flag, sizeof(int));
1563dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined_untyped(request, sizeof(MPI_Request));
1564b727b54c51af958caadd4ef1736b22ce59607eebsewardj   request_before = *request;
1565dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1566b727b54c51af958caadd4ef1736b22ce59607eebsewardj   CALL_FN_W_WWW(err, fn, request,flag,status);
1567dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1568b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (err == MPI_SUCCESS && *flag) {
1569b727b54c51af958caadd4ef1736b22ce59607eebsewardj      maybe_complete(False/*err in status?*/,
1570b727b54c51af958caadd4ef1736b22ce59607eebsewardj                     request_before, *request, status);
1571dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable_untyped(status, sizeof(MPI_Status));
1572b727b54c51af958caadd4ef1736b22ce59607eebsewardj   }
1573b727b54c51af958caadd4ef1736b22ce59607eebsewardj   after("Test", err);
1574b727b54c51af958caadd4ef1736b22ce59607eebsewardj   return err;
1575b727b54c51af958caadd4ef1736b22ce59607eebsewardj}
1576b727b54c51af958caadd4ef1736b22ce59607eebsewardj
1577b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Testall --- */
1578b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* nonblocking version of Waitall */
1579b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Testall)( int count, MPI_Request* requests,
1580b727b54c51af958caadd4ef1736b22ce59607eebsewardj                               int* flag, MPI_Status* statuses )
1581b727b54c51af958caadd4ef1736b22ce59607eebsewardj{
1582b727b54c51af958caadd4ef1736b22ce59607eebsewardj   MPI_Request* requests_before = NULL;
1583b727b54c51af958caadd4ef1736b22ce59607eebsewardj   OrigFn       fn;
1584b727b54c51af958caadd4ef1736b22ce59607eebsewardj   int          err, i;
1585753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   Bool         free_sta = False;
1586b727b54c51af958caadd4ef1736b22ce59607eebsewardj   VALGRIND_GET_ORIG_FN(fn);
1587b727b54c51af958caadd4ef1736b22ce59607eebsewardj   before("Testall");
1588b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (0) fprintf(stderr, "Testall: %d\n", count);
1589753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(statuses)) {
1590753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      free_sta = True;
1591753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      statuses = malloc( (count < 0 ? 0 : count) * sizeof(MPI_Status) );
1592753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   }
1593dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(flag, sizeof(int));
1594b727b54c51af958caadd4ef1736b22ce59607eebsewardj   for (i = 0; i < count; i++) {
1595dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_addressable_untyped(&statuses[i], sizeof(MPI_Status));
1596dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_defined_untyped(&requests[i], sizeof(MPI_Request));
1597b727b54c51af958caadd4ef1736b22ce59607eebsewardj   }
1598b727b54c51af958caadd4ef1736b22ce59607eebsewardj   requests_before = clone_Request_array( count, requests );
1599dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1600b727b54c51af958caadd4ef1736b22ce59607eebsewardj   CALL_FN_W_WWWW(err, fn, count,requests,flag,statuses);
1601dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1602b727b54c51af958caadd4ef1736b22ce59607eebsewardj   /* Urk.  Is the following "if (...)" really right?  I don't know. */
1603b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (*flag
1604b727b54c51af958caadd4ef1736b22ce59607eebsewardj       && (err == MPI_SUCCESS /*complete success*/
1605b727b54c51af958caadd4ef1736b22ce59607eebsewardj           || err == MPI_ERR_IN_STATUS /* partial success */)) {
1606b727b54c51af958caadd4ef1736b22ce59607eebsewardj      Bool e_i_s = err == MPI_ERR_IN_STATUS;
1607b727b54c51af958caadd4ef1736b22ce59607eebsewardj      for (i = 0; i < count; i++) {
1608b727b54c51af958caadd4ef1736b22ce59607eebsewardj         maybe_complete(e_i_s, requests_before[i], requests[i],
1609b727b54c51af958caadd4ef1736b22ce59607eebsewardj                               &statuses[i]);
1610753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj         make_mem_defined_if_addressable_untyped(&statuses[i],
1611753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj                                                 sizeof(MPI_Status));
1612b727b54c51af958caadd4ef1736b22ce59607eebsewardj      }
1613b727b54c51af958caadd4ef1736b22ce59607eebsewardj   }
1614b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (requests_before)
1615b727b54c51af958caadd4ef1736b22ce59607eebsewardj      free(requests_before);
1616753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (free_sta)
1617753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      free(statuses);
1618b727b54c51af958caadd4ef1736b22ce59607eebsewardj   after("Testall", err);
1619b727b54c51af958caadd4ef1736b22ce59607eebsewardj   return err;
1620b727b54c51af958caadd4ef1736b22ce59607eebsewardj}
1621b727b54c51af958caadd4ef1736b22ce59607eebsewardj
1622c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Iprobe --- */
1623c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre:  must-be-writable: *flag, *status */
1624c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* post: make-readable *flag
1625b727b54c51af958caadd4ef1736b22ce59607eebsewardj         if *flag==True  make-defined *status */
1626c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Iprobe)(int source, int tag,
1627c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             MPI_Comm comm,
1628c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             int* flag, MPI_Status* status)
1629c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1630753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status fake_status;
1631753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   OrigFn     fn;
1632753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   int        err;
1633c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1634c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Iprobe");
1635753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1636753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1637dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(flag, sizeof(*flag));
1638dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(status, sizeof(*status));
1639dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1640c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_5W(err, fn, source,tag,comm,flag,status);
1641dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1642c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS) {
1643dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable_untyped(flag, sizeof(*flag));
1644c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj      if (*flag)
1645dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn         make_mem_defined_if_addressable_untyped(status, sizeof(*status));
1646c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1647c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Iprobe", err);
1648c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1649c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1650c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1651b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Probe --- */
1652b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* pre:  must-be-writable *status */
1653b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* post: make-defined *status */
1654b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Probe)(int source, int tag,
1655b727b54c51af958caadd4ef1736b22ce59607eebsewardj                            MPI_Comm comm, MPI_Status* status)
1656b727b54c51af958caadd4ef1736b22ce59607eebsewardj{
1657753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status fake_status;
1658753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   OrigFn     fn;
1659753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   int        err;
1660b727b54c51af958caadd4ef1736b22ce59607eebsewardj   VALGRIND_GET_ORIG_FN(fn);
1661b727b54c51af958caadd4ef1736b22ce59607eebsewardj   before("Probe");
1662753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1663753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1664dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(status, sizeof(*status));
1665dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1666b727b54c51af958caadd4ef1736b22ce59607eebsewardj   CALL_FN_W_WWWW(err, fn, source,tag,comm,status);
1667dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1668dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success_untyped(err, status, sizeof(*status));
1669b727b54c51af958caadd4ef1736b22ce59607eebsewardj   after("Probe", err);
1670b727b54c51af958caadd4ef1736b22ce59607eebsewardj   return err;
1671b727b54c51af958caadd4ef1736b22ce59607eebsewardj}
1672b727b54c51af958caadd4ef1736b22ce59607eebsewardj
1673b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Cancel --- */
1674b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* Wrapping PMPI_Cancel is interesting only to the extent that we need
1675b727b54c51af958caadd4ef1736b22ce59607eebsewardj   to be able to detect when a request should be removed from our
1676b727b54c51af958caadd4ef1736b22ce59607eebsewardj   shadow table due to cancellation. */
1677b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Cancel)(MPI_Request* request)
1678b727b54c51af958caadd4ef1736b22ce59607eebsewardj{
1679b727b54c51af958caadd4ef1736b22ce59607eebsewardj   OrigFn      fn;
1680b727b54c51af958caadd4ef1736b22ce59607eebsewardj   int         err;
1681b727b54c51af958caadd4ef1736b22ce59607eebsewardj   MPI_Request tmp;
1682b727b54c51af958caadd4ef1736b22ce59607eebsewardj   VALGRIND_GET_ORIG_FN(fn);
1683b727b54c51af958caadd4ef1736b22ce59607eebsewardj   before("Cancel");
1684dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(request, sizeof(*request));
1685b727b54c51af958caadd4ef1736b22ce59607eebsewardj   tmp = *request;
1686dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1687b727b54c51af958caadd4ef1736b22ce59607eebsewardj   CALL_FN_W_W(err, fn, request);
1688dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1689b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (err == MPI_SUCCESS)
1690b727b54c51af958caadd4ef1736b22ce59607eebsewardj      delete_shadow_Request(tmp);
1691b727b54c51af958caadd4ef1736b22ce59607eebsewardj   after("Cancel", err);
1692b727b54c51af958caadd4ef1736b22ce59607eebsewardj   return err;
1693b727b54c51af958caadd4ef1736b22ce59607eebsewardj}
1694b727b54c51af958caadd4ef1736b22ce59607eebsewardj
1695c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1696c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1697c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1698c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.10, Send-receive                               ---*/
1699c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1700c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1701c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1702c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Sendrecv --- */
1703c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: must be readable: (sendbuf,sendcount,sendtype)
1704c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj        must be writable: (recvbuf,recvcount,recvtype)
1705c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   post: make readable: (recvbuf,recvcount_actual,datatype)
1706c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         where recvcount_actual is determined from *status
1707c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
1708c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Sendrecv)(
1709c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       void *sendbuf, int sendcount, MPI_Datatype sendtype,
1710c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       int dest, int sendtag,
1711c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       void *recvbuf, int recvcount, MPI_Datatype recvtype,
1712c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       int source, int recvtag,
1713c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       MPI_Comm comm,  MPI_Status *status)
1714c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1715753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   MPI_Status fake_status;
1716753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   OrigFn     fn;
1717753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   int        err, recvcount_actual = 0;
1718c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1719c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Sendrecv");
1720753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   if (isMSI(status))
1721753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj      status = &fake_status;
1722dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(sendbuf, sendcount, sendtype);
1723dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable(recvbuf, recvcount, recvtype);
1724753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj   check_mem_is_addressable_untyped(status, sizeof(*status));
1725dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1726c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_12W(err, fn, sendbuf,sendcount,sendtype,dest,sendtag,
1727c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                          recvbuf,recvcount,recvtype,source,recvtag,
1728c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                          comm,status);
1729dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
173026c60a8706eb45cbf303437adc87e313e104d4efsewardj   make_mem_defined_if_addressable_if_success_untyped(err, status, sizeof(*status));
1731c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (err == MPI_SUCCESS
1732c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       && count_from_Status(&recvcount_actual,recvtype,status)) {
1733dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable(recvbuf, recvcount_actual, recvtype);
1734c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1735c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Sendrecv", err);
1736c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1737c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1738c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1739c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1740c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1741c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1742c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.12, Derived datatypes                          ---*/
1743c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1744c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1745c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1746c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Address --- */
1747c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Does this have anything worth checking? */
17489c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Address)
17499c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
17509c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- MPI 2 stuff --- */
17519c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Type_extent, Type_get_contents and Type_get_envelope sometimes get
17529c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   used intensively by the type walker (walk_type).  There's no reason
17539c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   why they couldn't be properly wrapped if needed, but doing so slows
17549c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   everything down, so don't bother until needed. */
17559c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Type_extent)
17569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Type_get_contents)
17579c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Type_get_envelope)
17589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
17599c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Type_commit --- */
17609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Type_commit)( MPI_Datatype* ty )
17619c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
17629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   OrigFn fn;
17639c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int    err;
17649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   VALGRIND_GET_ORIG_FN(fn);
17659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("Type_commit");
1766dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined_untyped(ty, sizeof(*ty));
1767dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
17689c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   CALL_FN_W_W(err, fn, ty);
1769dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
17709c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("Type_commit", err);
17719c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return err;
17729c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
17739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
17749c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Type_free --- */
17759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Type_free)( MPI_Datatype* ty )
17769c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
17779c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   OrigFn fn;
17789c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int    err;
17799c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   VALGRIND_GET_ORIG_FN(fn);
17809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("Type_free");
1781dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined_untyped(ty, sizeof(*ty));
1782dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
17839c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   CALL_FN_W_W(err, fn, ty);
1784dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
17859c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("Type_free", err);
17869c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return err;
17879c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
1788c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1789c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1790c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1791c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1792ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*--- Sec 3.13, Pack and unpack                            ---*/
1793ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*---                                                      ---*/
1794ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*------------------------------------------------------------*/
1795ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1796ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* --- Pack --- */
1797ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* pre: must be readable: position
1798ee3465927d146e6b632dc550e1f6f41867bb5321sewardj        must be readable: (inbuf,incount,datatype)
1799ee3465927d146e6b632dc550e1f6f41867bb5321sewardj        must be writable: outbuf[0 .. outsize-1]
1800ee3465927d146e6b632dc550e1f6f41867bb5321sewardj        must be writable: outbuf[*position ..
1801ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                                 *position - 1
1802ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                                 + however much space PMPI_Pack_size
1803ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                                   says we will need]
1804ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   post: make readable: outbuf[old *position .. new *position]
1805ee3465927d146e6b632dc550e1f6f41867bb5321sewardj*/
1806ee3465927d146e6b632dc550e1f6f41867bb5321sewardjint WRAPPER_FOR(PMPI_Pack)( void* inbuf, int incount, MPI_Datatype datatype,
1807ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                            void* outbuf, int outsize,
1808ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                            int* position, MPI_Comm comm )
1809ee3465927d146e6b632dc550e1f6f41867bb5321sewardj{
1810ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   OrigFn fn;
1811ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   int    err, szB = 0;
1812ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   int    position_ORIG = *position;
1813ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   VALGRIND_GET_ORIG_FN(fn);
1814ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   before("Pack");
1815ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* stay sane */
1816ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   check_mem_is_defined_untyped(position, sizeof(*position));
1817ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* check input */
1818ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   check_mem_is_defined(inbuf, incount, datatype);
1819ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* check output area's stated bounds make sense */
1820ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   check_mem_is_addressable_untyped(outbuf, outsize);
1821ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* check output area's actual used size properly */
1822ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   err = PMPI_Pack_size( incount, datatype, comm, &szB );
1823ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   if (err == MPI_SUCCESS && szB > 0) {
1824ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      check_mem_is_addressable_untyped(
1825ee3465927d146e6b632dc550e1f6f41867bb5321sewardj         ((char*)outbuf) + position_ORIG, szB
1826ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      );
1827ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   }
1828ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1829dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1830ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   CALL_FN_W_7W(err, fn, inbuf,incount,datatype, outbuf,outsize,position, comm);
1831dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1832ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1833ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   if (err == MPI_SUCCESS && (*position) > position_ORIG) {
1834ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      /* paint output */
1835ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      make_mem_defined_if_addressable_untyped(
1836ee3465927d146e6b632dc550e1f6f41867bb5321sewardj         ((char*)outbuf) + position_ORIG, *position - position_ORIG
1837ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      );
1838ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   }
1839ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   after("Pack", err);
1840ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   return err;
1841ee3465927d146e6b632dc550e1f6f41867bb5321sewardj}
1842ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1843ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* --- Unpack --- */
1844ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* pre: must be readable: position
1845ee3465927d146e6b632dc550e1f6f41867bb5321sewardj        must be writable: (outbuf,outcount,datatype)
1846ee3465927d146e6b632dc550e1f6f41867bb5321sewardj        must be writable: outbuf[0 .. outsize-1]
1847ee3465927d146e6b632dc550e1f6f41867bb5321sewardj        must be writable: outbuf[*position ..
1848ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                                 *position - 1
1849ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                                 + however much space PMPI_Pack_size
1850ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                                   says we will need]
1851ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   post: make readable: (outbuf,outcount,datatype)
1852ee3465927d146e6b632dc550e1f6f41867bb5321sewardj         and also do a readability check of
1853ee3465927d146e6b632dc550e1f6f41867bb5321sewardj         inbuf[old *position .. new *position]
1854ee3465927d146e6b632dc550e1f6f41867bb5321sewardj*/
1855ee3465927d146e6b632dc550e1f6f41867bb5321sewardjint WRAPPER_FOR(PMPI_Unpack)( void* inbuf, int insize, int* position,
1856ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                              void* outbuf, int outcount, MPI_Datatype datatype,
1857ee3465927d146e6b632dc550e1f6f41867bb5321sewardj                              MPI_Comm comm )
1858ee3465927d146e6b632dc550e1f6f41867bb5321sewardj{
1859ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   OrigFn fn;
1860ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   int    err, szB = 0;
1861ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   int    position_ORIG = *position;
1862ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   VALGRIND_GET_ORIG_FN(fn);
1863ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   before("Unpack");
1864ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* stay sane */
1865ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   check_mem_is_defined_untyped(position, sizeof(*position));
1866ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* check output area is accessible */
1867ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   check_mem_is_addressable(outbuf, outcount, datatype);
1868ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* check input area's stated bounds make sense */
1869ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   check_mem_is_addressable_untyped(inbuf, insize);
1870ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   /* check input area's actual used size properly */
1871ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   err = PMPI_Pack_size( outcount, datatype, comm, &szB );
1872ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   if (err == MPI_SUCCESS && szB > 0) {
1873ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      check_mem_is_addressable_untyped(
1874ee3465927d146e6b632dc550e1f6f41867bb5321sewardj         ((char*)inbuf) + position_ORIG, szB
1875ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      );
1876ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   }
1877ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1878dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1879ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   CALL_FN_W_7W(err, fn, inbuf,insize,position, outbuf,outcount,datatype, comm);
1880dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1881ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1882ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   if (err == MPI_SUCCESS && (*position) > position_ORIG) {
1883ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      /* recheck input more carefully */
1884ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      check_mem_is_defined_untyped(
1885ee3465927d146e6b632dc550e1f6f41867bb5321sewardj         ((char*)inbuf) + position_ORIG, *position - position_ORIG
1886ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      );
1887ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      /* paint output */
1888ee3465927d146e6b632dc550e1f6f41867bb5321sewardj      make_mem_defined_if_addressable( outbuf, outcount, datatype );
1889ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   }
1890ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   after("Unpack", err);
1891ee3465927d146e6b632dc550e1f6f41867bb5321sewardj   return err;
1892ee3465927d146e6b632dc550e1f6f41867bb5321sewardj}
1893ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1894ee3465927d146e6b632dc550e1f6f41867bb5321sewardj
1895ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*------------------------------------------------------------*/
1896ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*---                                                      ---*/
1897c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 4.4, Broadcast                                   ---*/
1898c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1899c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1900c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1901c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Bcast --- */
1902c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre:  must-be-readable (buffer,count,datatype) for rank==root
1903c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         must-be-writable (buffer,count,datatype) for rank!=root
1904c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   post: make-readable (buffer,count,datatype) for all
1905c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1906c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Resulting behaviour is: if root sends uninitialised stuff, then
1907c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   V complains, but then all ranks, including itself, see the buffer
1908c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   as initialised after that.
1909c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
1910c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Bcast)(void *buffer, int count,
1911c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                            MPI_Datatype datatype,
1912c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                            int root, MPI_Comm comm)
1913c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1914c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
1915c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
1916c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Bool  i_am_sender;
1917c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1918c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Bcast");
1919c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   i_am_sender = root == comm_rank(comm);
1920c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (i_am_sender) {
1921dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_defined(buffer, count, datatype);
1922c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   } else {
1923dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_addressable(buffer, count, datatype);
1924c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   }
1925dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1926c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_5W(err, fn, buffer,count,datatype,root,comm);
1927dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1928dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success(err, buffer, count, datatype);
1929c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Bcast", err);
1930c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1931c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1932c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1933c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1934c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1935c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1936c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 4.5, Gather                                      ---*/
1937c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1938c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1939c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1940c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Gather --- */
1941c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* JRS 20060217: I don't really understand this.  Each process is
1942c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   going to send sendcount items of type sendtype to the root.  So
1943c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   the root is going to receive comm_size*sendcount items of type
1944c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sendtype (right?)  So why specify recvcount and recvtype?
1945c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1946c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Anyway, assuming the MPI Spec is correct (seems likely :-) we have:
1947c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1948c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   pre:  (all)        must be readable: (sendbuf,sendcount,sendtype)
1949c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj         (root only): must be writable: (recvbuf,recvcount * comm_size,recvtype)
1950c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   post: (root only): make readable: (recvbuf,recvcount * comm_size,recvtype)
1951c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
1952c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Gather)(
1953c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       void *sendbuf, int sendcount, MPI_Datatype sendtype,
1954c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       void *recvbuf, int recvcount, MPI_Datatype recvtype,
1955c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj       int root, MPI_Comm comm)
1956c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
1957c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
1958c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err, me, sz;
1959c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
1960c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Gather");
1961c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   me = comm_rank(comm);
1962c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   sz = comm_size(comm);
1963dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(sendbuf, sendcount, sendtype);
1964c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (me == root)
1965dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_addressable(recvbuf, recvcount * sz, recvtype);
1966dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
1967c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype,
1968c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         recvbuf,recvcount,recvtype,
1969c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                         root,comm);
1970dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
1971b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (me == root)
1972dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable_if_success(err, recvbuf, recvcount * sz, recvtype);
1973c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Gather", err);
1974c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
1975c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
1976c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1977c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
1978c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
1979c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
1980b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- Sec 4.6, Scatter                                     ---*/
1981b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*---                                                      ---*/
1982b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/
1983b727b54c51af958caadd4ef1736b22ce59607eebsewardj
1984b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* pre:  (root only): must be readable: (sendbuf,sendcount * comm_size,sendtype)
1985b727b54c51af958caadd4ef1736b22ce59607eebsewardj         (all):       must be writable: (recvbuf,recvbuf,recvtype)
1986b727b54c51af958caadd4ef1736b22ce59607eebsewardj   post: (all):       make defined: (recvbuf,recvbuf,recvtype)
1987b727b54c51af958caadd4ef1736b22ce59607eebsewardj*/
1988b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Scatter)(
1989b727b54c51af958caadd4ef1736b22ce59607eebsewardj       void* sendbuf, int sendcount, MPI_Datatype sendtype,
1990b727b54c51af958caadd4ef1736b22ce59607eebsewardj       void* recvbuf, int recvcount, MPI_Datatype recvtype,
1991b727b54c51af958caadd4ef1736b22ce59607eebsewardj       int root, MPI_Comm comm)
1992b727b54c51af958caadd4ef1736b22ce59607eebsewardj{
1993b727b54c51af958caadd4ef1736b22ce59607eebsewardj   OrigFn fn;
1994b727b54c51af958caadd4ef1736b22ce59607eebsewardj   int    err, me, sz;
1995b727b54c51af958caadd4ef1736b22ce59607eebsewardj   VALGRIND_GET_ORIG_FN(fn);
1996b727b54c51af958caadd4ef1736b22ce59607eebsewardj   before("Scatter");
1997b727b54c51af958caadd4ef1736b22ce59607eebsewardj   me = comm_rank(comm);
1998b727b54c51af958caadd4ef1736b22ce59607eebsewardj   sz = comm_size(comm);
1999dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable(recvbuf, recvcount, recvtype);
2000b727b54c51af958caadd4ef1736b22ce59607eebsewardj   if (me == root)
2001dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_defined(sendbuf, sendcount * sz, sendtype);
2002dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2003b727b54c51af958caadd4ef1736b22ce59607eebsewardj   CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype,
2004b727b54c51af958caadd4ef1736b22ce59607eebsewardj                         recvbuf,recvcount,recvtype,
2005b727b54c51af958caadd4ef1736b22ce59607eebsewardj                         root,comm);
2006dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2007dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success(err, recvbuf, recvcount, recvtype);
2008b727b54c51af958caadd4ef1736b22ce59607eebsewardj   after("Scatter", err);
2009b727b54c51af958caadd4ef1736b22ce59607eebsewardj   return err;
2010b727b54c51af958caadd4ef1736b22ce59607eebsewardj}
2011b727b54c51af958caadd4ef1736b22ce59607eebsewardj
2012b727b54c51af958caadd4ef1736b22ce59607eebsewardj
2013b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/
2014b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*---                                                      ---*/
2015b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- Sec 4.8, All-to-All Scatter/Gather                   ---*/
2016b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*---                                                      ---*/
2017b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/
2018b727b54c51af958caadd4ef1736b22ce59607eebsewardj
2019b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* pre:  (all) must be readable: (sendbuf,sendcount * comm_size,sendtype)
2020b727b54c51af958caadd4ef1736b22ce59607eebsewardj         (all) must be writable: (recvbuf,recvcount * comm_size,recvtype)
2021b727b54c51af958caadd4ef1736b22ce59607eebsewardj   post: (all) make defined:     (recvbuf,recvcount * comm_size,recvtype)
2022b727b54c51af958caadd4ef1736b22ce59607eebsewardj*/
2023b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Alltoall)(
2024b727b54c51af958caadd4ef1736b22ce59607eebsewardj       void* sendbuf, int sendcount, MPI_Datatype sendtype,
2025b727b54c51af958caadd4ef1736b22ce59607eebsewardj       void* recvbuf, int recvcount, MPI_Datatype recvtype,
2026b727b54c51af958caadd4ef1736b22ce59607eebsewardj       MPI_Comm comm)
2027b727b54c51af958caadd4ef1736b22ce59607eebsewardj{
2028b727b54c51af958caadd4ef1736b22ce59607eebsewardj   OrigFn fn;
2029b727b54c51af958caadd4ef1736b22ce59607eebsewardj   int    err, sz;
2030b727b54c51af958caadd4ef1736b22ce59607eebsewardj   VALGRIND_GET_ORIG_FN(fn);
2031b727b54c51af958caadd4ef1736b22ce59607eebsewardj   before("Alltoall");
2032b727b54c51af958caadd4ef1736b22ce59607eebsewardj   sz = comm_size(comm);
2033dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(sendbuf, sendcount * sz, sendtype);
2034dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable(recvbuf, recvcount * sz, recvtype);
2035dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2036b727b54c51af958caadd4ef1736b22ce59607eebsewardj   CALL_FN_W_7W(err, fn, sendbuf,sendcount,sendtype,
2037b727b54c51af958caadd4ef1736b22ce59607eebsewardj                         recvbuf,recvcount,recvtype,
2038b727b54c51af958caadd4ef1736b22ce59607eebsewardj                         comm);
2039dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2040dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success(err, recvbuf, recvcount * sz, recvtype);
2041b727b54c51af958caadd4ef1736b22ce59607eebsewardj   after("Alltoall", err);
2042b727b54c51af958caadd4ef1736b22ce59607eebsewardj   return err;
2043b727b54c51af958caadd4ef1736b22ce59607eebsewardj}
2044b727b54c51af958caadd4ef1736b22ce59607eebsewardj
2045b727b54c51af958caadd4ef1736b22ce59607eebsewardj
2046b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/
2047b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*---                                                      ---*/
2048c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 4.9, Global Reduction Operations                 ---*/
2049c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2050c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2051c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2052c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Reduce --- */
2053c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: (sendbuf,count,datatype) for all
2054c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   wr: (recvbuf,count,datatype) but only for rank == root
2055c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
2056c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Reduce)(void *sendbuf, void *recvbuf,
2057c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             int count,
2058c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             MPI_Datatype datatype, MPI_Op op,
2059c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                             int root, MPI_Comm comm)
2060c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2061c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2062c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2063c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Bool  i_am_root;
2064c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2065c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Reduce");
2066c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   i_am_root = root == comm_rank(comm);
2067dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(sendbuf, count, datatype);
2068c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (i_am_root)
2069dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      check_mem_is_addressable(recvbuf, count, datatype);
2070dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2071c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_7W(err, fn, sendbuf,recvbuf,count,datatype,op,root,comm);
2072dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2073c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   if (i_am_root)
2074dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn      make_mem_defined_if_addressable_if_success(err, recvbuf, count, datatype);
2075c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Reduce", err);
2076c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2077c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2078c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2079c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2080c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Allreduce --- */
2081c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: (sendbuf,count,datatype) for all
2082c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   wr: (recvbuf,count,datatype) for all
2083c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/
2084c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Allreduce)(void *sendbuf, void *recvbuf,
2085c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                int count,
2086c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                MPI_Datatype datatype, MPI_Op op,
2087c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                MPI_Comm comm)
2088c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2089c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2090c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2091c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2092c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Allreduce");
2093dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_defined(sendbuf, count, datatype);
2094dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable(recvbuf, count, datatype);
2095dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2096c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_6W(err, fn, sendbuf,recvbuf,count,datatype,op,comm);
2097dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2098dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success(err, recvbuf, count, datatype);
2099c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Allreduce", err);
2100c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2101c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2102c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2103c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2104c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Op_create --- */
2105c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* This is a bit dubious.  I suppose it takes 'function' and
2106c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   writes something at *op, but who knows what an MPI_Op is?
2107c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   Can we safely do 'sizeof' on it? */
2108c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Op_create)( MPI_User_function* function,
2109c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                 int commute,
2110c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj                                 MPI_Op* op )
2111c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2112c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2113c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2114c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2115c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Op_create");
2116dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(op, sizeof(*op));
2117dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2118c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_WWW(err, fn, function,commute,op);
2119dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2120dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success_untyped(err, op, sizeof(*op));
2121c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Op_create", err);
2122c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2123c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2124c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2125c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2126c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2127c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2128c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 5.4, Communicator management                     ---*/
2129c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2130c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2131c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2132c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Hardly seems worth wrapping Comm_rank and Comm_size, but
2133c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   since it's done now .. */
2134c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
21359c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Comm_create --- */
21369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Let normal memcheck tracking handle this. */
21379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Comm_create)(MPI_Comm comm, MPI_Group group,
21389c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                                  MPI_Comm* newcomm)
21399c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
21409c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   OrigFn fn;
21419c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int    err;
21429c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   VALGRIND_GET_ORIG_FN(fn);
21439c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("Comm_create");
2144dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
21459c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   CALL_FN_W_WWW(err, fn, comm,group,newcomm);
2146dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
21479c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("Comm_create", err);
21489c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return err;
21499c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
21509c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
21519c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Comm_dup --- */
21529c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Let normal memcheck tracking handle this. */
21539c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Comm_dup)(MPI_Comm comm, MPI_Comm* newcomm)
21549c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
21559c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   OrigFn fn;
21569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int    err;
21579c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   VALGRIND_GET_ORIG_FN(fn);
21589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("Comm_dup");
2159dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
21609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   CALL_FN_W_WW(err, fn, comm,newcomm);
2161dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
21629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("Comm_dup", err);
21639c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return err;
21649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
21659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
21669c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Comm_free --- */
21679c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Let normal memcheck tracking handle this. */
21689c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Comm_free)(MPI_Comm* comm)
21699c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{
21709c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   OrigFn fn;
21719c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   int    err;
21729c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   VALGRIND_GET_ORIG_FN(fn);
21739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   before("Comm_free");
2174dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
21759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   CALL_FN_W_W(err, fn, comm);
2176dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
21779c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   after("Comm_free", err);
21789c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj   return err;
21799c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj}
21809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj
2181c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Comm_rank --- */
2182c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* wr: (rank, sizeof(*rank)) */
2183c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Comm_rank)(MPI_Comm comm, int *rank)
2184c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2185c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2186c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2187c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2188c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Comm_rank");
2189dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(rank, sizeof(*rank));
2190dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2191c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_WW(err, fn, comm,rank);
2192dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2193dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success_untyped(err, rank, sizeof(*rank));
2194c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Comm_rank", err);
2195c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2196c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2197c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2198c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Comm_size --- */
2199c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* wr: (size, sizeof(*size)) */
2200c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Comm_size)(MPI_Comm comm, int *size)
2201c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2202c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2203c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2204c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2205c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Comm_size");
2206dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(size, sizeof(*size));
2207dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2208c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_WW(err, fn, comm,size);
2209dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2210dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success_untyped(err, size, sizeof(*size));
2211c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Comm_size", err);
2212c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2213c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2214c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2215c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2216c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2217c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2218c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 5.7, Caching                                     ---*/
2219c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2220c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2221c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2222c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2223c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2224c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
22257d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*--- Sec 7.3, Error codes and classes                     ---*/
22267d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*---                                                      ---*/
22277d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*------------------------------------------------------------*/
22287d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj
22297d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/* --- Error_string --- */
22309c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Error_string)( int errorcode, char* string,
22319c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj                                    int* resultlen )
22327d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj{
22337d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   OrigFn fn;
22347d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   int    err;
22357d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   VALGRIND_GET_ORIG_FN(fn);
22367d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   before("Error_string");
2237dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(resultlen, sizeof(int));
2238dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(string, MPI_MAX_ERROR_STRING);
2239dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
22407d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   CALL_FN_W_WWW(err, fn, errorcode,string,resultlen);
2241dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
22427d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   /* Don't bother to paint the result; we assume the real function
22437d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj      will have filled it with defined characters :-) */
22447d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   after("Error_string", err);
22457d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj   return err;
22467d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj}
22477d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj
22487d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj
22497d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*------------------------------------------------------------*/
22507d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*---                                                      ---*/
2251c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 7.5, Startup                                     ---*/
2252c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2253c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2254c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2255c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Init --- */
2256c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: *argc, *argv[0 .. *argc-1] */
2257d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjlong WRAPPER_FOR(PMPI_Init)(int *argc, char ***argv)
2258c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2259c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2260c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2261c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2262c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Init");
22631ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj   if (argc) {
22641ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj      check_mem_is_defined_untyped(argc, sizeof(int));
22651ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj   }
22661ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj   if (argc && argv) {
22671ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj      check_mem_is_defined_untyped(*argv, *argc * sizeof(char**));
22681ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj   }
2269dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2270c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_WW(err, fn, argc,argv);
2271dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2272c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Init", err);
2273d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj   if (opt_initkludge)
2274d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj      return (long)(void*)&mpiwrap_walk_type_EXTERNALLY_VISIBLE;
2275d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj   else
2276d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj      return (long)err;
2277c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2278c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2279c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Initialized --- */
2280c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Initialized)(int* flag)
2281c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2282c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2283c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2284c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2285c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Initialized");
2286dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   check_mem_is_addressable_untyped(flag, sizeof(int));
2287dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2288c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_W(err, fn, flag);
2289dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2290dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn   make_mem_defined_if_addressable_if_success_untyped(err, flag, sizeof(int));
2291c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Initialized", err);
2292c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2293c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2294c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2295c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Finalize --- */
2296c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Finalize)(void)
2297c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{
2298c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   OrigFn fn;
2299c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   int    err;
2300c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   VALGRIND_GET_ORIG_FN(fn);
2301c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   before("Finalize");
2302dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;
2303c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   CALL_FN_W_v(err, fn);
2304dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj   if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;
2305c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   after("Finalize", err);
2306c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj   return err;
2307c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj}
2308c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2309c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2310c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2311c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
231263daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*--- Default wrappers for all remaining functions         ---*/
2313c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---                                                      ---*/
2314c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/
2315c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
23169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Boilerplate for default wrappers. */
231763daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_PREAMBLE(basename)                        \
231863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      OrigFn fn;                                                  \
231963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      UWord  res;                                                 \
23200d17f240576b3a42d203259391c0822385a22273sewardj      static int complaints = 1;                                  \
232163daa8afee0bf09c5527975d14f884d98ee77f9esewardj      VALGRIND_GET_ORIG_FN(fn);                                   \
232263daa8afee0bf09c5527975d14f884d98ee77f9esewardj      before(#basename);                                          \
232363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      if (opt_missing >= 2) {                                     \
232463daa8afee0bf09c5527975d14f884d98ee77f9esewardj         barf("no wrapper for PMPI_" #basename                    \
232563daa8afee0bf09c5527975d14f884d98ee77f9esewardj              ",\n\t\t\t     and you have "                       \
232663daa8afee0bf09c5527975d14f884d98ee77f9esewardj              "requested strict checking");                       \
232763daa8afee0bf09c5527975d14f884d98ee77f9esewardj      }                                                           \
232863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      if (opt_missing == 1 && complaints > 0) {                   \
232963daa8afee0bf09c5527975d14f884d98ee77f9esewardj         fprintf(stderr, "%s %5d: warning: no wrapper "           \
233063daa8afee0bf09c5527975d14f884d98ee77f9esewardj                         "for PMPI_" #basename "\n",              \
233163daa8afee0bf09c5527975d14f884d98ee77f9esewardj                 preamble, my_pid);                               \
233263daa8afee0bf09c5527975d14f884d98ee77f9esewardj         complaints--;                                            \
233363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      }                                                           \
233463daa8afee0bf09c5527975d14f884d98ee77f9esewardj
233563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_0W(basename)                            \
233663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)( void )                     \
233763daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
233863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2339dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
234063daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_v(res, fn);                                       \
2341dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
234263daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
234363daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2344c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
234563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_1W(basename)                            \
234663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)( UWord a1 )                 \
234763daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
234863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2349dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
235063daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_W(res, fn, a1);                                   \
2351dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
235263daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
235363daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2354c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
235563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_2W(basename)                            \
235663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)( UWord a1, UWord a2 )       \
235763daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
235863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2359dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
236063daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_WW(res, fn, a1,a2);                               \
2361dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
236263daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
236363daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2364c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
236563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_3W(basename)                            \
236663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
236763daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3 )                            \
236863daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
236963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2370dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
237163daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_WWW(res, fn, a1,a2,a3);                           \
2372dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
237363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
237463daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2375c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
237663daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_4W(basename)                            \
237763daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
237863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4 )                  \
237963daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
238063daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2381dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
238263daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_WWWW(res, fn, a1,a2,a3,a4);                       \
2383dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
238463daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
238563daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2386c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
238763daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_5W(basename)                            \
238863daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
238963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5 )        \
239063daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
239163daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2392dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
239363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_5W(res, fn, a1,a2,a3,a4,a5);                      \
2394dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
239563daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
239663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2397c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
239863daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_6W(basename)                            \
239963daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
240063daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,         \
240163daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a6 )                                                \
240263daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
240363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2404dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
240563daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_6W(res, fn, a1,a2,a3,a4,a5,a6);                   \
2406dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
240763daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
240863daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2409c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
241063daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_7W(basename)                            \
241163daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
241263daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,         \
241363daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a6, UWord a7 )                                      \
241463daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
241563daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2416dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
241763daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_7W(res, fn, a1,a2,a3,a4,a5,a6,a7);                \
2418dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
241963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
242063daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2421c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
242263daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_8W(basename)                            \
242363daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
242463daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,         \
242563daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a6, UWord a7, UWord a8 )                            \
242663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
242763daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2428dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
242963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_8W(res, fn, a1,a2,a3,a4,a5,a6,a7,a8);             \
2430dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
243163daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
243263daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2433c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
243463daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_9W(basename)                            \
243563daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
243663daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,         \
243763daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a6, UWord a7, UWord a8, UWord a9 )                  \
243863daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
243963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2440dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
244163daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_9W(res, fn, a1,a2,a3,a4,a5,a6,a7,a8,a9);          \
2442dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
244363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
244463daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2445c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
244663daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_10W(basename)                           \
244763daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
244863daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,         \
244963daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a6, UWord a7, UWord a8, UWord a9, UWord a10 )       \
245063daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
245163daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2452dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
245363daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_10W(res, fn, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);     \
2454dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
245563daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
245663daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2457c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
245863daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_12W(basename)                           \
245963daa8afee0bf09c5527975d14f884d98ee77f9esewardj   UWord WRAPPER_FOR(PMPI_##basename)                             \
246063daa8afee0bf09c5527975d14f884d98ee77f9esewardj      ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,         \
246163daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a6, UWord a7, UWord a8, UWord a9, UWord a10,        \
246263daa8afee0bf09c5527975d14f884d98ee77f9esewardj        UWord a11, UWord a12 )                                    \
246363daa8afee0bf09c5527975d14f884d98ee77f9esewardj   {                                                              \
246463daa8afee0bf09c5527975d14f884d98ee77f9esewardj      DEFAULT_WRAPPER_PREAMBLE(basename)                          \
2465dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING;           \
246663daa8afee0bf09c5527975d14f884d98ee77f9esewardj      CALL_FN_W_12W(res, fn, a1,a2,a3,a4,a5,a6,                   \
246763daa8afee0bf09c5527975d14f884d98ee77f9esewardj                             a7,a8,a9,a10,a11,a12);               \
2468dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj      if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING;            \
246963daa8afee0bf09c5527975d14f884d98ee77f9esewardj      return res;                                                 \
247063daa8afee0bf09c5527975d14f884d98ee77f9esewardj   }
2471c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2472c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
247363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* Canned summary of MPI-1.1/MPI-2 entry points, as derived from mpi.h
247463daa8afee0bf09c5527975d14f884d98ee77f9esewardj   from Open MPI svn rev 9191 (somewhere between Open MPI versions
247563daa8afee0bf09c5527975d14f884d98ee77f9esewardj   1.0.1 and 1.1.0). */
247663daa8afee0bf09c5527975d14f884d98ee77f9esewardj
247763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* If a function is commented out in this list, it's because it has a
247863daa8afee0bf09c5527975d14f884d98ee77f9esewardj   proper wrapper written elsewhere (above here). */
247963daa8afee0bf09c5527975d14f884d98ee77f9esewardj
248063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Abort)
248163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Accumulate)
248263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Add_error_class)
248363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Add_error_code)
248463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Add_error_string)
24859c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_2W(Address) */
248663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Allgather)
248763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Allgatherv)
248863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Alloc_mem)
248963daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_6W(Allreduce) */
2490b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_7W(Alltoall) */
249163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Alltoallv)
249263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Alltoallw)
249363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Attr_delete)
249463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Attr_get)
249563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Attr_put)
249663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Barrier)
249763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_5W(Bcast) */
24989c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_6W(Bsend) */
249963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Bsend_init)
250063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Buffer_attach)
250163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Buffer_detach)
2502b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_1W(Cancel) */
250363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Cart_coords)
250463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Cart_create)
250563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Cart_get)
250663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Cart_map)
250763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Cart_rank)
250863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Cart_shift)
250963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Cart_sub)
251063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Cartdim_get)
251163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Close_port)
251263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Comm_accept)
251363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_c2f)
251463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_call_errhandler)
251563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Comm_compare)
251663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Comm_connect)
251763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_create_errhandler)
251863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Comm_create_keyval)
25199c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_3W(Comm_create) */
252063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_delete_attr)
252163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_disconnect)
25229c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_2W(Comm_dup) */
252363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_f2c)
252463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_free_keyval)
25259c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_1W(Comm_free) */
252663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Comm_get_attr)
252763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_get_errhandler)
252863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Comm_get_name)
252963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_get_parent)
253063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_group)
253163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_join)
253263daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Comm_rank) */
253363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_remote_group)
253463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_remote_size)
253563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Comm_set_attr)
253663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_set_errhandler)
253763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_set_name)
253863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Comm_size) */
253963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Comm_spawn)
254063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Comm_spawn_multiple)
254163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Comm_split)
254263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_test_inter)
254363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Dims_create)
254463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Errhandler_c2f)
254563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Errhandler_create)
254663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Errhandler_f2c)
254763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Errhandler_free)
254863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Errhandler_get)
254963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Errhandler_set)
255063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Error_class)
255163daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_3W(Error_string) */
255263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Exscan)
255363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_c2f)
255463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_f2c)
255563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_call_errhandler)
255663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_create_errhandler)
255763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_errhandler)
255863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_errhandler)
255963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_open)
256063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_close)
256163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_delete)
256263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_size)
256363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_preallocate)
256463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_size)
256563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_group)
256663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_amode)
256763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_info)
256863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_info)
256963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_set_view)
257063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_get_view)
257163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_read_at)
257263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_read_at_all)
257363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_write_at)
257463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_write_at_all)
257563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_iread_at)
257663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_iwrite_at)
257763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read)
257863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_all)
257963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write)
258063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_all)
258163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iread)
258263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iwrite)
258363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_seek)
258463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_position)
258563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_get_byte_offset)
258663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_shared)
258763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_shared)
258863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iread_shared)
258963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iwrite_shared)
259063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_ordered)
259163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_ordered)
259263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_seek_shared)
259363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_position_shared)
259463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_at_all_begin)
259563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_read_at_all_end)
259663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_at_all_begin)
259763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_write_at_all_end)
259863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_read_all_begin)
259963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_read_all_end)
260063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_write_all_begin)
260163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_write_all_end)
260263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_read_ordered_begin)
260363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_read_ordered_end)
260463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_write_ordered_begin)
260563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_write_ordered_end)
260663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_get_type_extent)
260763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_atomicity)
260863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_atomicity)
260963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_sync)
261063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_0W(Finalize) */
261163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Finalized)
261263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Free_mem)
261363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_8W(Gather) */
261463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Gatherv)
261563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Get_address)
26169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_3W(Get_count) */
261763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Get_elements)
261863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Get)
261963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Get_processor_name)
262063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Get_version)
262163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Graph_create)
262263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Graph_get)
262363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Graph_map)
262463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Graph_neighbors_count)
262563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Graph_neighbors)
262663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Graphdims_get)
262763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Grequest_complete)
262863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Grequest_start)
262963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Group_c2f)
263063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_compare)
263163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_difference)
263263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_excl)
263363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Group_f2c)
263463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Group_free)
263563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_incl)
263663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_intersection)
263763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_range_excl)
263863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_range_incl)
263963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Group_rank)
264063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Group_size)
264163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Group_translate_ranks)
264263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_union)
26439c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Ibsend) */
264463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_c2f)
264563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_create)
264663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Info_delete)
264763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Info_dup)
264863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_f2c)
264963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_free)
265063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Info_get)
265163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Info_get_nkeys)
265263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Info_get_nthkey)
265363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Info_get_valuelen)
265463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Info_set)
265563daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Init) */
265663daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_1W(Initialized) */
265763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Init_thread)
265863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Intercomm_create)
265963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Intercomm_merge)
266063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_5W(Iprobe) */
266163daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Irecv) */
26629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Irsend) */
266363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Isend) */
26649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Issend) */
266563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Is_thread_main)
266663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Keyval_create)
266763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Keyval_free)
266863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Lookup_name)
266963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Op_c2f)
267063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_3W(Op_create) */
267163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Open_port)
267263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Op_f2c)
267363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Op_free)
267463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Pack_external)
267563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Pack_external_size)
2676ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* DEFAULT_WRAPPER_W_7W(Pack) */
267763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Pack_size)
267863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* int MPI_Pcontrol(const int level, ...) */
2679b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_4W(Probe) */
268063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Publish_name)
268163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Put)
268263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Query_thread)
268363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Recv_init)
268463daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Recv) */
268563daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Reduce) */
268663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Reduce_scatter)
268763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Register_datarep)
268863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Request_c2f)
268963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Request_f2c)
269063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Request_free)
269163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Request_get_status)
26929c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_6W(Rsend) */
269363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Rsend_init)
269463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Scan)
2695b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_8W(Scatter) */
269663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Scatterv)
269763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Send_init)
269863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_6W(Send) */
269963daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_12W(Sendrecv) */
270063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Sendrecv_replace)
270163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Ssend_init)
27029c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_6W(Ssend) */
270363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Start)
270463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Startall)
270563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Status_c2f)
270663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Status_f2c)
270763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Status_set_cancelled)
270863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Status_set_elements)
2709b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_4W(Testall) */
271063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Testany)
2711b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_3W(Test) */
271263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Test_cancelled)
271363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Testsome)
271463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Topo_test)
271563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Type_c2f)
27169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_1W(Type_commit) */
271763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_contiguous)
271863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_10W(Type_create_darray)
271963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_create_f90_complex)
272063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_create_f90_integer)
272163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_create_f90_real)
272263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_hindexed)
272363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_hvector)
272463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Type_create_keyval)
272563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_indexed_block)
272663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_struct)
272763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Type_create_subarray)
272863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Type_create_resized)
272963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_delete_attr)
273063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_dup)
27319c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_2W(Type_extent) */
27329c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_1W(Type_free) */
273363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Type_free_keyval)
273463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Type_f2c)
273563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Type_get_attr)
27369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Type_get_contents) */
27379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_5W(Type_get_envelope) */
273863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_get_extent)
273963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_get_name)
274063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_get_true_extent)
274163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_hindexed)
274263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_hvector)
274363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_indexed)
274463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_lb)
274563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_match_size)
274663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_set_attr)
274763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_set_name)
274863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_size)
274963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_struct)
275063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_ub)
275163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_vector)
2752ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* DEFAULT_WRAPPER_W_7W(Unpack) */
275363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Unpublish_name)
275463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Unpack_external)
275563daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_3W(Waitall) */
2756982751b29b4fe1623a8ce3504004b567f27a2b5csewardj/* DEFAULT_WRAPPER_W_4W(Waitany) */
275763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Wait) */
275863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Waitsome)
275963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_c2f)
276063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_call_errhandler)
276163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_complete)
276263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Win_create)
276363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_create_errhandler)
276463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Win_create_keyval)
276563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_delete_attr)
276663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_f2c)
276763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_fence)
276863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_free)
276963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_free_keyval)
277063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Win_get_attr)
277163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_get_errhandler)
277263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_get_group)
277363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_get_name)
277463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Win_lock)
277563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_post)
277663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_set_attr)
277763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_set_errhandler)
277863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_set_name)
277963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_start)
278063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_test)
278163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_unlock)
278263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_wait)
278363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* double MPI_Wtick(void) */
278463daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* double MPI_Wtime(void) */
2785c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2786c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
278763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*------------------------------------------------------------*/
278863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*---                                                      ---*/
278963daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*---                                                      ---*/
279063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*---                                                      ---*/
279163daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*------------------------------------------------------------*/
2792c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj
2793c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/
2794c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- end                                           mpiwrap.c ---*/
2795c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/
2796