1 /* 2 * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana 3 * University Research and Technology 4 * Corporation. All rights reserved. 5 * Copyright (c) 2004-2005 The University of Tennessee and The University 6 * of Tennessee Research Foundation. All rights 7 * reserved. 8 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 9 * University of Stuttgart. All rights reserved. 10 * Copyright (c) 2004-2005 The Regents of the University of California. 11 * All rights reserved. 12 * Copyright (c) 2007-2012 Cisco Systems, Inc. All rights reserved. 13 * Copyright (c) 2015 Research Organization for Information Science 14 * and Technology (RIST). All rights reserved. 15 * $COPYRIGHT$ 16 * 17 * Additional copyrights may follow 18 * 19 * $HEADER$ 20 */ 21 22 /** 23 * @file 24 * 25 * This file does two things: 26 * 27 * 1. Provides typedef for the Fortran versions of the callbacks 28 * registered by MPI_REGISTER_DATAREP. These typedefs are needed for 29 * the Fortran MPI API. 30 * 31 * 2. Provides the sentinel value functions/function pointers for 32 * Fortran's version of MPI_CONVERSION_FN_NULL, and some helpful 33 * macros for testing whether an argument passed to a Fortran MPI API 34 * function is that sentinel value or not. 35 */ 36 37 #ifndef OMPI_FORTRAN_BASE_DATAREP_H 38 #define OMPI_FORTRAN_BASE_DATAREP_H 39 40 #include "ompi_config.h" 41 42 #include "mpi.h" 43 44 BEGIN_C_DECLS 45 46 /** 47 * Function typedef for the conversion function pointer in 48 * MPI_REGISTER_DATAREP */ 49 typedef void (ompi_mpi2_fortran_datarep_conversion_fn_t) 50 (char *userbuf, MPI_Fint *datatype, MPI_Fint *count, char *filebuf, 51 MPI_Offset *position, MPI_Aint *extra_state, MPI_Fint *ierr); 52 53 /** 54 * Function typedef for the extent function pointer in 55 * MPI_REGISTER_DATAREP */ 56 typedef void (ompi_mpi2_fortran_datarep_extent_fn_t) 57 (MPI_Fint *datatype, MPI_Aint *extent, MPI_Aint *extra_state, 58 MPI_Fint *ierr); 59 60 /** 61 * Macro for declaring each of the 5 back-end Fortran functions for 62 * MPI_CONVERSION_FN_NULL. We need the 4 fortran compiler convetions 63 * and 1 for the "real" back-end function (even though these functions 64 * are never invoked -- they're only used as sentinel values -- it's 65 * simpler to use the same kind of code structure that we use for the 66 * Fortran MPI API bindings and other callback functions). 67 */ 68 #define OMPI_DATAREP_FORTRAN_DECLARE(lower_name, upper_name, args) \ 69 OMPI_DECLSPEC void lower_name##_f args; \ 70 OMPI_DECLSPEC void lower_name args; \ 71 OMPI_DECLSPEC void lower_name##_ args; \ 72 OMPI_DECLSPEC void lower_name##__ args; \ 73 OMPI_DECLSPEC void upper_name args; 74 75 /* 76 * Declare the 5 functions. 77 */ 78 OMPI_DATAREP_FORTRAN_DECLARE(mpi_conversion_fn_null, MPI_CONVERSION_FN_NULL, (char *userbuf, MPI_Fint *datatype, MPI_Fint *count, char *filebuf, MPI_Offset *position, MPI_Aint *extra_state, MPI_Fint *ierr)) 79 80 /* Be social and remove this private macro from the global header file 81 space */ 82 #undef OMPI_DATAREP_FORTRAN_DECLARE 83 84 /** 85 * Declare the test macro in all of its forms. This macro provides a 86 * convenient way to check whether an argument is the sentinel value 87 * MPI_CONVERSION_FN_NULL. 88 */ 89 #if OMPI_FORTRAN_CAPS 90 #define OMPI_IS_FORTRAN_CONVERSION_FN_NULL(addr) \ 91 (MPI_CONVERSION_FN_NULL == addr) 92 #elif OMPI_FORTRAN_PLAIN 93 #define OMPI_IS_FORTRAN_CONVERSION_FN_NULL(addr) \ 94 (mpi_conversion_fn_null == addr) 95 #elif OMPI_FORTRAN_SINGLE_UNDERSCORE 96 #define OMPI_IS_FORTRAN_CONVERSION_FN_NULL(addr) \ 97 (mpi_conversion_fn_null_ == addr) 98 #elif OMPI_FORTRAN_DOUBLE_UNDERSCORE 99 #define OMPI_IS_FORTRAN_CONVERSION_FN_NULL(addr) \ 100 (mpi_conversion_fn_null__ == addr) 101 #else 102 #error Unrecognized Fortran name mangling scheme 103 #endif 104 105 END_C_DECLS 106 107 #endif 108