/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef MPIR_FUNC_H_INCLUDED
#define MPIR_FUNC_H_INCLUDED
/* In MPICH, each function has an "enter" and "exit" macro. These can be
* used to add various features to each function at compile time, or they
* can be set to empty to provide the fastest possible production version.
*
* There are at this time three choices of features (beyond the empty choice)
* 1. timing
* These collect data on when each function began and finished; the
* resulting data can be displayed using special programs
* 2. Debug logging (selected with --enable-g=log)
* Invokes MPL_DBG_MSG at the entry and exit for each routine
* 3. Additional memory validation of the memory arena (--enable-g=memarena)
*/
/* function enter and exit macros */
#if defined(MPL_USE_DBG_LOGGING)
#define MPIR_FUNC_ENTER(a) MPL_DBG_MSG(MPL_DBG_ROUTINE_ENTER,TYPICAL,"Entering "#a)
#elif defined(MPICH_DEBUG_MEMARENA)
#define MPIR_FUNC_ENTER(a) MPL_trvalid("Entering " #a)
#endif
#if defined(MPL_USE_DBG_LOGGING)
#define MPIR_FUNC_EXIT(a) MPL_DBG_MSG(MPL_DBG_ROUTINE_EXIT,TYPICAL,"Leaving "#a)
#elif defined(MPICH_DEBUG_MEMARENA)
#define MPIR_FUNC_EXIT(a) MPL_trvalid("Leaving " #a)
#endif
/* state declaration macros */
#if defined(MPL_USE_DBG_LOGGING) || defined(MPICH_DEBUG_MEMARENA)
#define MPIR_FUNC_TERSE_STATE_DECL(a)
#define MPIR_FUNC_TERSE_INIT_STATE_DECL(a)
#define MPIR_FUNC_TERSE_FINALIZE_STATE_DECL(a)
#define MPIR_FUNC_TERSE_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER_FRONT(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT_FRONT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER_BACK(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER_BOTH(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT_BACK(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT_BOTH(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_COLL_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_COLL_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_RMA_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_RMA_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_REQUEST_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_REQUEST_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_INIT_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_INIT_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_TERSE_FINALIZE_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_TERSE_FINALIZE_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_VERBOSE_STATE_DECL(a)
#define MPIR_FUNC_VERBOSE_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_VERBOSE_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_VERBOSE_PT2PT_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_VERBOSE_PT2PT_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPIR_FUNC_VERBOSE_RMA_ENTER(a) MPIR_FUNC_ENTER(a)
#define MPIR_FUNC_VERBOSE_RMA_EXIT(a) MPIR_FUNC_EXIT(a)
#define MPII_Timer_init(rank, size)
#define MPII_Timer_finalize()
#else /* ! defined(MPL_USE_DBG_LOGGING) && ! defined(MPICH_DEBUG_MEMARENA) */
/* Routine tracing (see --enable-timing for control of this) */
#if defined(HAVE_TIMING) && (HAVE_TIMING == MPICH_TIMING_KIND__LOG || \
HAVE_TIMING == MPICH_TIMING_KIND__LOG_DETAILED || \
HAVE_TIMING == MPICH_TIMING_KIND__ALL || \
HAVE_TIMING == MPICH_TIMING_KIND__RUNTIME)
#include "mpiallstates.h"
#if (USE_LOGGING == MPICH_LOGGING__RLOG)
#include "rlog_macros.h"
#elif (USE_LOGGING == MPICH_LOGGING__EXTERNAL)
#include "mpilogging.h"
#else
#error You must select a logging library if timing is enabled
#endif
#else /* HAVE_TIMING and doing logging */
#define MPII_Timer_init(rank, size)
#define MPII_Timer_finalize()
#define MPIR_FUNC_TERSE_STATE_DECL(a)
#define MPIR_FUNC_TERSE_INIT_STATE_DECL(a)
#define MPIR_FUNC_TERSE_FINALIZE_STATE_DECL(a)
#define MPIR_FUNC_TERSE_EXIT(a)
#define MPIR_FUNC_TERSE_ENTER(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER_FRONT(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT_FRONT(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER_BACK(a)
#define MPIR_FUNC_TERSE_PT2PT_ENTER_BOTH(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT_BACK(a)
#define MPIR_FUNC_TERSE_PT2PT_EXIT_BOTH(a)
#define MPIR_FUNC_TERSE_COLL_ENTER(a)
#define MPIR_FUNC_TERSE_COLL_EXIT(a)
#define MPIR_FUNC_TERSE_RMA_ENTER(a)
#define MPIR_FUNC_TERSE_RMA_EXIT(a)
#define MPIR_FUNC_TERSE_REQUEST_ENTER(a)
#define MPIR_FUNC_TERSE_REQUEST_EXIT(a)
#define MPIR_FUNC_TERSE_INIT_ENTER(a)
#define MPIR_FUNC_TERSE_INIT_EXIT(a)
#define MPIR_FUNC_TERSE_FINALIZE_ENTER(a)
#define MPIR_FUNC_TERSE_FINALIZE_EXIT(a)
#define MPIR_FUNC_VERBOSE_STATE_DECL(a)
#define MPIR_FUNC_VERBOSE_ENTER(a)
#define MPIR_FUNC_VERBOSE_EXIT(a)
#define MPIR_FUNC_VERBOSE_PT2PT_ENTER(a)
#define MPIR_FUNC_VERBOSE_PT2PT_EXIT(a)
#define MPIR_FUNC_VERBOSE_RMA_ENTER(a)
#define MPIR_FUNC_VERBOSE_RMA_EXIT(a)
#endif /* HAVE_TIMING */
#endif /* ! defined(MPL_USE_DBG_LOGGING) && ! defined(MPICH_DEBUG_MEMARENA) */
#endif /* MPIR_FUNC_H_INCLUDED */