Blame src/mpi_t/pvar_reset.c

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *  (C) 2011 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
Packit 0848f5
#include "mpiimpl.h"
Packit 0848f5
#include "mpl_utlist.h"
Packit 0848f5
Packit 0848f5
/* -- Begin Profiling Symbol Block for routine MPI_T_pvar_reset */
Packit 0848f5
#if defined(HAVE_PRAGMA_WEAK)
Packit 0848f5
#pragma weak MPI_T_pvar_reset = PMPI_T_pvar_reset
Packit 0848f5
#elif defined(HAVE_PRAGMA_HP_SEC_DEF)
Packit 0848f5
#pragma _HP_SECONDARY_DEF PMPI_T_pvar_reset  MPI_T_pvar_reset
Packit 0848f5
#elif defined(HAVE_PRAGMA_CRI_DUP)
Packit 0848f5
#pragma _CRI duplicate MPI_T_pvar_reset as PMPI_T_pvar_reset
Packit 0848f5
#elif defined(HAVE_WEAK_ATTRIBUTE)
Packit 0848f5
int MPI_T_pvar_reset(MPI_T_pvar_session session, MPI_T_pvar_handle handle) __attribute__((weak,alias("PMPI_T_pvar_reset")));
Packit 0848f5
#endif
Packit 0848f5
/* -- End Profiling Symbol Block */
Packit 0848f5
Packit 0848f5
/* Define MPICH_MPI_FROM_PMPI if weak symbols are not supported to build
Packit 0848f5
   the MPI routines */
Packit 0848f5
#ifndef MPICH_MPI_FROM_PMPI
Packit 0848f5
#undef MPI_T_pvar_reset
Packit 0848f5
#define MPI_T_pvar_reset PMPI_T_pvar_reset
Packit 0848f5
Packit 0848f5
/* any non-MPI functions go here, especially non-static ones */
Packit 0848f5
Packit 0848f5
#undef FUNCNAME
Packit 0848f5
#define FUNCNAME MPIR_T_pvar_reset_impl
Packit 0848f5
#undef FCNAME
Packit 0848f5
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit 0848f5
int MPIR_T_pvar_reset_impl(MPI_T_pvar_session session, MPI_T_pvar_handle handle)
Packit 0848f5
{
Packit 0848f5
    int mpi_errno = MPI_SUCCESS;
Packit 0848f5
    MPIR_T_pvar_watermark_t *mark;
Packit 0848f5
Packit 0848f5
    if (MPIR_T_pvar_is_sum(handle)) {
Packit 0848f5
        /* Use zero as starting value */
Packit 0848f5
        memset(handle->accum, 0, handle->bytes * handle->count);
Packit 0848f5
Packit 0848f5
        /* Record current value as offset when pvar is running (i.e., started) */
Packit 0848f5
        if (MPIR_T_pvar_is_started(handle)) {
Packit 0848f5
            if (handle->get_value == NULL) {
Packit 0848f5
                MPIU_Memcpy(handle->offset, handle->addr, handle->bytes * handle->count);
Packit 0848f5
            } else {
Packit 0848f5
                handle->get_value(handle->addr, handle->obj_handle,
Packit 0848f5
                                  handle->count, handle->offset);
Packit 0848f5
            }
Packit 0848f5
        }
Packit 0848f5
    } else if (MPIR_T_pvar_is_watermark(handle)) {
Packit 0848f5
        if (MPIR_T_pvar_is_started(handle)) {
Packit 0848f5
            /* Use the current value as starting value when pvar is running */
Packit 0848f5
            mark = (MPIR_T_pvar_watermark_t *)handle->addr;
Packit 0848f5
            if (MPIR_T_pvar_is_first(handle)) {
Packit 0848f5
                MPIU_Assert(mark->first_used);
Packit 0848f5
                mark->watermark = mark->current;
Packit 0848f5
            } else {
Packit 0848f5
                handle->watermark = mark->current;
Packit 0848f5
            }
Packit 0848f5
        } else {
Packit 0848f5
            /* If pvar is stopped, clear the oncestarted flag
Packit 0848f5
             * so that when it is re-started, it looks new.
Packit 0848f5
             */
Packit 0848f5
            MPIR_T_pvar_unset_oncestarted(handle);
Packit 0848f5
        }
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
fn_exit:
Packit 0848f5
    return mpi_errno;
Packit 0848f5
fn_fail:
Packit 0848f5
    goto fn_exit;
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
#endif /* MPICH_MPI_FROM_PMPI */
Packit 0848f5
Packit 0848f5
#undef FUNCNAME
Packit 0848f5
#define FUNCNAME MPI_T_pvar_reset
Packit 0848f5
#undef FCNAME
Packit 0848f5
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit 0848f5
/*@
Packit 0848f5
MPI_T_pvar_reset - Reset a performance variable
Packit 0848f5
Packit 0848f5
Input Parameters:
Packit 0848f5
+ session - identifier of performance experiment session (handle)
Packit 0848f5
- handle - handle of a performance variable (handle)
Packit 0848f5
Packit 0848f5
Notes:
Packit 0848f5
The MPI_T_pvar_reset() call sets the performance variable with the handle identified
Packit 0848f5
by the parameter handle to its starting value. If it is not possible
Packit 0848f5
to change the variable, the function returns MPI_T_ERR_PVAR_NO_WRITE.
Packit 0848f5
If the constant MPI_T_PVAR_ALL_HANDLES is passed in handle, the MPI implementation
Packit 0848f5
attempts to reset all variables within the session identified by the parameter session for
Packit 0848f5
which handles have been allocated. In this case, the routine returns MPI_SUCCESS if all
Packit 0848f5
variables are reset successfully, otherwise MPI_T_ERR_PVAR_NO_WRITE is returned. Readonly
Packit 0848f5
variables are ignored when MPI_T_PVAR_ALL_HANDLES is specified.
Packit 0848f5
Packit 0848f5
.N ThreadSafe
Packit 0848f5
Packit 0848f5
.N Errors
Packit 0848f5
.N MPI_SUCCESS
Packit 0848f5
.N MPI_T_ERR_NOT_INITIALIZED
Packit 0848f5
.N MPI_T_ERR_INVALID_SESSION
Packit 0848f5
.N MPI_T_ERR_INVALID_HANDLE
Packit 0848f5
.N MPI_T_ERR_PVAR_NO_WRITE
Packit 0848f5
@*/
Packit 0848f5
int MPI_T_pvar_reset(MPI_T_pvar_session session, MPI_T_pvar_handle handle)
Packit 0848f5
{
Packit 0848f5
    int mpi_errno = MPI_SUCCESS;
Packit 0848f5
    MPIR_T_pvar_handle_t *hnd;
Packit 0848f5
Packit 0848f5
    MPID_MPI_STATE_DECL(MPID_STATE_MPI_T_PVAR_RESET);
Packit 0848f5
    MPIR_ERRTEST_MPIT_INITIALIZED(mpi_errno);
Packit 0848f5
    MPIR_T_THREAD_CS_ENTER();
Packit 0848f5
    MPID_MPI_FUNC_ENTER(MPID_STATE_MPI_T_PVAR_RESET);
Packit 0848f5
Packit 0848f5
     /* Validate parameters, especially handles needing to be converted */
Packit 0848f5
#   ifdef HAVE_ERROR_CHECKING
Packit 0848f5
    {
Packit 0848f5
        MPID_BEGIN_ERROR_CHECKS
Packit 0848f5
        {
Packit 0848f5
            MPIR_ERRTEST_PVAR_SESSION(session, mpi_errno);
Packit 0848f5
            MPIR_ERRTEST_PVAR_HANDLE(handle, mpi_errno);
Packit 0848f5
        }
Packit 0848f5
        MPID_END_ERROR_CHECKS
Packit 0848f5
    }
Packit 0848f5
#   endif /* HAVE_ERROR_CHECKING */
Packit 0848f5
Packit 0848f5
    /* ... body of routine ...  */
Packit 0848f5
Packit 0848f5
    /* If handle is MPI_T_PVAR_ALL_HANDLES, dispatch the call.
Packit 0848f5
     * Otherwise, do correctness check, then go to impl.
Packit 0848f5
     */
Packit 0848f5
    if (handle == MPI_T_PVAR_ALL_HANDLES) {
Packit 0848f5
        MPL_DL_FOREACH(session->hlist, hnd) {
Packit 0848f5
            if (!MPIR_T_pvar_is_readonly(hnd)) {
Packit 0848f5
                mpi_errno = MPIR_T_pvar_reset_impl(session, hnd);
Packit 0848f5
                if (mpi_errno != MPI_SUCCESS) goto fn_fail;
Packit 0848f5
            }
Packit 0848f5
        }
Packit 0848f5
    } else {
Packit 0848f5
        if (handle->session != session) {
Packit 0848f5
            mpi_errno = MPI_T_ERR_INVALID_HANDLE;
Packit 0848f5
            goto fn_fail;
Packit 0848f5
        }
Packit 0848f5
Packit 0848f5
        if (MPIR_T_pvar_is_readonly(handle)) {
Packit 0848f5
            mpi_errno = MPI_T_ERR_PVAR_NO_WRITE;
Packit 0848f5
            goto fn_fail;
Packit 0848f5
        }
Packit 0848f5
Packit 0848f5
        mpi_errno = MPIR_T_pvar_reset_impl(session, handle);
Packit 0848f5
        if (mpi_errno != MPI_SUCCESS) goto fn_fail;
Packit 0848f5
    }
Packit 0848f5
Packit 0848f5
    /* ... end of body of routine ... */
Packit 0848f5
Packit 0848f5
fn_exit:
Packit 0848f5
    MPID_MPI_FUNC_EXIT(MPID_STATE_MPI_T_PVAR_RESET);
Packit 0848f5
    MPIR_T_THREAD_CS_EXIT();
Packit 0848f5
    return mpi_errno;
Packit 0848f5
Packit 0848f5
fn_fail:
Packit 0848f5
    /* --BEGIN ERROR HANDLING-- */
Packit 0848f5
#   ifdef HAVE_ERROR_CHECKING
Packit 0848f5
    {
Packit 0848f5
        mpi_errno = MPIR_Err_create_code(
Packit 0848f5
            mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit 0848f5
            "**mpi_t_pvar_reset", "**mpi_t_pvar_reset %p %p", session, handle);
Packit 0848f5
    }
Packit 0848f5
#   endif
Packit 0848f5
    mpi_errno = MPIR_Err_return_comm(NULL, FCNAME, mpi_errno);
Packit 0848f5
    goto fn_exit;
Packit 0848f5
    /* --END ERROR HANDLING-- */
Packit 0848f5
}