abd21b6d17
1. fix a bug in pml_ob1_recvreq/sendreq.c, buffer was made defined where the request has already been released. 2. complete memchecker support for collective functions. 3. change the wrongly spelled function name of memchecker, i.e. '*_isaddressible' should be '*_isaddressable' This commit was SVN r20043.
209 строки
4.5 KiB
C
209 строки
4.5 KiB
C
/*
|
|
* Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2008 The Trustees of Indiana University.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* memchecker (memory checker) valgrind framework component interface.
|
|
*
|
|
* Intent
|
|
*/
|
|
|
|
#include "opal_config.h"
|
|
|
|
#include "opal/constants.h"
|
|
#include "opal/mca/base/mca_base_param.h"
|
|
#include "opal/mca/memchecker/memchecker.h"
|
|
#include "opal/mca/memchecker/base/base.h"
|
|
#include "memchecker_valgrind.h"
|
|
#include "valgrind/valgrind.h"
|
|
#include "valgrind/memcheck.h"
|
|
|
|
|
|
/*
|
|
* Local functions
|
|
*/
|
|
static int valgrind_module_init(void);
|
|
static int valgrind_module_runindebugger(void);
|
|
static int valgrind_module_isaddressable(void * p, size_t len);
|
|
static int valgrind_module_isdefined(void * p, size_t len);
|
|
static int valgrind_module_mem_noaccess(void * p, size_t len);
|
|
static int valgrind_module_mem_undefined(void * p, size_t len);
|
|
static int valgrind_module_mem_defined(void * p, size_t len);
|
|
static int valgrind_module_mem_defined_if_addressable(void * p, size_t len);
|
|
static int valgrind_module_create_block(void * p, size_t len, char * description);
|
|
static int valgrind_module_discard_block(void * p); /* Here, we need to do some mapping for valgrind */
|
|
static int valgrind_module_leakcheck(void);
|
|
#if 0
|
|
static int valgrind_module_get_vbits(void * p, char * vbits, size_t len);
|
|
static int valgrind_module_set_vbits(void * p, char * vbits, size_t len);
|
|
#endif
|
|
|
|
/*
|
|
* Valgrind memchecker module
|
|
*/
|
|
static const opal_memchecker_base_module_1_0_0_t loc_module = {
|
|
/* Initialization function */
|
|
valgrind_module_init,
|
|
|
|
/* Module function pointers */
|
|
valgrind_module_runindebugger,
|
|
valgrind_module_isaddressable,
|
|
valgrind_module_isdefined,
|
|
valgrind_module_mem_noaccess,
|
|
valgrind_module_mem_undefined,
|
|
valgrind_module_mem_defined,
|
|
valgrind_module_mem_defined_if_addressable,
|
|
valgrind_module_create_block,
|
|
valgrind_module_discard_block,
|
|
valgrind_module_leakcheck
|
|
};
|
|
|
|
|
|
int opal_memchecker_valgrind_component_query(mca_base_module_t **module, int *priority)
|
|
{
|
|
int param;
|
|
|
|
param = mca_base_param_find("memchecker", "valgrind", "priority");
|
|
mca_base_param_lookup_int(param, priority);
|
|
|
|
*module = (mca_base_module_t *)&loc_module;
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_init(void)
|
|
{
|
|
/* Nothing to do yet, possibly update the amount of memory blocks. */
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_runindebugger(void)
|
|
{
|
|
return RUNNING_ON_VALGRIND;
|
|
}
|
|
|
|
|
|
static int valgrind_module_isaddressable(void * p, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_CHECK_MEM_IS_ADDRESSABLE(p, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_isdefined(void * p, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_CHECK_MEM_IS_DEFINED(p, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_mem_noaccess(void * p, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_MAKE_MEM_NOACCESS(p, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_mem_undefined(void * p, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_MAKE_MEM_UNDEFINED(p, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_mem_defined(void * p, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_MAKE_MEM_DEFINED(p, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_mem_defined_if_addressable(void * p, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(p, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_create_block(void * p, size_t len, char * description)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_CREATE_BLOCK (p, len, description);
|
|
/*
|
|
* Add p to some list atomically
|
|
*/
|
|
}
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_discard_block(void * p)
|
|
{
|
|
/* Here, we need to do some mapping for valgrind */
|
|
/*
|
|
* If p in list, then get rid of name
|
|
*/
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_leakcheck(void)
|
|
{
|
|
VALGRIND_DO_LEAK_CHECK;
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
#if 0
|
|
static int valgrind_module_get_vbits(void * p, char * vbits, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_GET_VBITS(p, vbits, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
|
|
static int valgrind_module_set_vbits(void * p, char * vbits, size_t len)
|
|
{
|
|
if (len > 0) {
|
|
VALGRIND_SET_VBITS(p, vbits, len);
|
|
}
|
|
|
|
return OPAL_SUCCESS;
|
|
}
|
|
#endif
|
|
|