/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*
*/
#ifndef MPIR_ERRHANDLER_H_INCLUDED
#define MPIR_ERRHANDLER_H_INCLUDED
/*E
errhandler_fn - MPIR Structure to hold an error handler function
Notes:
The MPI-1 Standard declared only the C version of this, implicitly
assuming that 'int' and 'MPI_Fint' were the same.
Since Fortran does not have a C-style variable number of arguments
interface, the Fortran interface simply accepts two arguments. Some
calling conventions for Fortran (particularly under Windows) require
this.
Module:
ErrHand-DS
Questions:
What do we want to do about C++? Do we want a hook for a routine that can
be called to throw an exception in C++, particularly if we give C++ access
to this structure? Does the C++ handler need to be different (not part
of the union)?
E*/
typedef union errhandler_fn {
void (*C_Comm_Handler_function) (MPI_Comm *, int *, ...);
void (*F77_Handler_function) (MPI_Fint *, MPI_Fint *);
void (*C_Win_Handler_function) (MPI_Win *, int *, ...);
void (*C_File_Handler_function) (MPI_File *, int *, ...);
} errhandler_fn;
/*S
MPIR_Errhandler - Description of the error handler structure
Notes:
Device-specific information may indicate whether the error handler is active;
this can help prevent infinite recursion in error handlers caused by
user-error without requiring the user to be as careful. We might want to
make this part of the interface so that the 'MPI_xxx_call_errhandler'
routines would check.
It is useful to have a way to indicate that the errhandler is no longer
valid, to help catch the case where the user has freed the errhandler but
is still using a copy of the 'MPI_Errhandler' value. We may want to
define the 'id' value for deleted errhandlers.
Module:
ErrHand-DS
S*/
typedef struct MPIR_Errhandler {
MPIR_OBJECT_HEADER; /* adds handle and ref_count fields */
MPIR_Lang_t language;
MPII_Object_kind kind;
errhandler_fn errfn;
/* Other, device-specific information */
#ifdef MPID_DEV_ERRHANDLER_DECL
MPID_DEV_ERRHANDLER_DECL
#endif
} MPIR_Errhandler;
extern MPIR_Object_alloc_t MPIR_Errhandler_mem;
/* Preallocated errhandler objects */
#define MPIR_ERRHANDLER_N_BUILTIN 3
extern MPIR_Errhandler MPIR_Errhandler_builtin[];
extern MPIR_Errhandler MPIR_Errhandler_direct[];
/* We never reference count the builtin error handler objects, regardless of how
* we decide to reference count the other predefined objects. If we get to the
* point where we never reference count *any* of the builtin objects then we
* should probably remove these checks and let them fall through to the checks
* for BUILTIN down in the MPIR_Object_* routines. */
#define MPIR_Errhandler_add_ref(_errhand) \
do { \
if (HANDLE_GET_KIND((_errhand)->handle) != HANDLE_KIND_BUILTIN) { \
MPIR_Object_add_ref(_errhand); \
} \
} while (0)
#define MPIR_Errhandler_release_ref(_errhand, _inuse) \
do { \
if (HANDLE_GET_KIND((_errhand)->handle) != HANDLE_KIND_BUILTIN) { \
MPIR_Object_release_ref((_errhand), (_inuse)); \
} \
else { \
*(_inuse) = 1; \
} \
} while (0)
void MPIR_Errhandler_free(MPIR_Errhandler * errhan_ptr);
#endif /* MPIR_ERRHANDLER_H_INCLUDED */