Blob Blame History Raw
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
 *  (C) 2006 by Argonne National Laboratory.
 *      See COPYRIGHT in top-level directory.
 */

/* This file contains the prototypes for routines that are used with
   "external" modules such as ROMIO.  These allow the different packages to
   hide their internal datatypes from one another */

#ifndef MPIEXT_H_INCLUDED
#define MPIEXT_H_INCLUDED

#include <stdarg.h>

/* This routine, given an MPI_Errhandler (from a file), returns
   a pointer to the user-supplied error function.  The last argument
   is set to an integer indicating that the function is MPI_ERRORS_RETURN
   (value == 1), MPI_ERRORS_ARE_FATAL (value == 0), a valid user-function
   (value == 2), or a valid user-function that is a C++ routine (value == 3)

   This routine is implemented in mpich/src/mpi/errhan/file_set_errhandler.c
*/
void MPIR_Get_file_error_routine(MPI_Errhandler, void (**)(MPI_File *, int *, ...), int *);

/* Invoke the C++ error handler (this invokes a special C++ routine that
 in turn calls the provided function.  That special routine also
 resets the errorcode to MPI_SUCCESS to prevent the MPICH C++ error handling
 code from throwing an exception when the user routine returns.
*/
int MPIR_File_call_cxx_errhandler(MPI_File *, int *, void (*)(MPI_File *, int *, ...));
/*
   These routines provide access to the MPI_Errhandler field within the
   ROMIO MPI_File structure
 */
int MPIR_ROMIO_Get_file_errhand(MPI_File, MPI_Errhandler *);
int MPIR_ROMIO_Set_file_errhand(MPI_File, MPI_Errhandler);

/* FIXME: This routine is also defined in adio.h */
int MPIO_Err_return_file(MPI_File, int);

int MPIR_Err_create_code_valist(int, int, const char[], int, int,
                                const char[], const char[], va_list);
int MPIR_Err_is_fatal(int);

void MPIR_Get_file_error_routine(MPI_Errhandler, void (**)(MPI_File *, int *, ...), int *);
int MPIR_File_call_cxx_errhandler(MPI_File *, int *, void (*)(MPI_File *, int *, ...));

typedef int (*MPIR_Err_get_class_string_func_t) (int error, char *str, int length);
void MPIR_Err_get_string(int, char *, int, MPIR_Err_get_class_string_func_t);

struct MPIR_Comm;
int MPIR_Abort(MPI_Comm comm, int mpi_errno, int exit_code, const char *error_msg);

int MPIR_Ext_assert_fail(const char *cond, const char *file_name, int line_num);

#if (!defined(NDEBUG) && (@HAVE_ERROR_CHECKING@))
#define MPIR_Ext_assert(a_)                                \
    do {                                                   \
        if (!(a_)) {                                       \
            MPIR_Ext_assert_fail(#a_, __FILE__, __LINE__); \
        }                                                  \
    } while (0)
#else
#define MPIR_Ext_assert(a_) do {} while (0)
#endif

extern int MPIR_Ext_dbg_romio_terse_enabled;
extern int MPIR_Ext_dbg_romio_typical_enabled;
extern int MPIR_Ext_dbg_romio_verbose_enabled;

/* a copy of MPIU_Ensure_Aint_fits_in_pointer for external use, slightly
 * modified to use ROMIO's version of the pointer-casting macro */
#define MPIR_Ext_ensure_Aint_fits_in_pointer(aint) \
  MPIR_Ext_assert((aint) == (MPI_Aint)(uintptr_t) ADIOI_AINT_CAST_TO_VOID_PTR(aint));

/* to be called early by ROMIO's initialization process in order to setup init-time
 * glue code that cannot be initialized statically */
int MPIR_Ext_init(void);

void MPIR_Ext_cs_enter(void);
void MPIR_Ext_cs_exit(void);
void MPIR_Ext_cs_yield(void);

/* to facilitate error checking */
int MPIR_Ext_datatype_iscommitted(MPI_Datatype datatype);

/* make comm split based on access to a common file system easier */
int MPIR_Get_node_id(MPI_Comm comm, int rank, int *id);

#endif