1
1

- Instead of calling RUNNING_ON_VALGRIND,

implement specific function, thereby
   removing bogus requirement on valgrind/valgrind.h
   dough...
 - Call specific function runindebugger() before
   doing expensive checks on each component of struct.
 - Get rid of void* warnings..

This commit was SVN r17438.
Этот коммит содержится в:
Rainer Keller 2008-02-12 20:37:51 +00:00
родитель 280bf75b5f
Коммит 9cd2c6f48b
7 изменённых файлов: 63 добавлений и 12 удалений

Просмотреть файл

@ -22,14 +22,9 @@
#include "opal/mca/memchecker/base/base.h" #include "opal/mca/memchecker/base/base.h"
#if OMPI_WANT_MEMCHECKER #if OMPI_WANT_MEMCHECKER
/* JMS why is this here? Seems like an abstraction violation... */
#include "valgrind/valgrind.h"
# define MEMCHECKER(x) do { \ # define MEMCHECKER(x) do { \
if(RUNNING_ON_VALGRIND){ \
x; \ x; \
} \ } while(0)
} while(0)
#else #else
# define MEMCHECKER(x) # define MEMCHECKER(x)
#endif /* OMPI_WANT_MEMCHECKER */ #endif /* OMPI_WANT_MEMCHECKER */
@ -204,10 +199,14 @@ static inline int memchecker_call (int (*f)(void *, size_t), void * p, size_t co
#ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
static inline int memchecker_comm(MPI_Comm comm) static inline int memchecker_comm(MPI_Comm comm)
{ {
/* if (!opal_memchecker_base_runindebugger()) {
* We should not check unterlying objects in this way -- either another opal/include/memchecker.h return OMPI_SUCCESS;
* However, let us assume, that underlying objects are initialized correctly }
*/
/*
* We should not check unterlying objects in this way -- either another opal/include/memchecker.h
* However, let us assume, that underlying objects are initialized correctly
*/
#if 0 #if 0
/* c_base */ /* c_base */
opal_memchecker_base_isdefined (&comm->c_base.obj_class, sizeof(opal_class_t *)); opal_memchecker_base_isdefined (&comm->c_base.obj_class, sizeof(opal_class_t *));
@ -304,6 +303,10 @@ static inline int memchecker_comm(MPI_Comm comm)
#ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
static inline int memchecker_request(MPI_Request *request) static inline int memchecker_request(MPI_Request *request)
{ {
if (!opal_memchecker_base_runindebugger()) {
return OMPI_SUCCESS;
}
#if 0 #if 0
opal_memchecker_base_isdefined (&(*request)->super.super.super.obj_class, sizeof(opal_class_t *)); opal_memchecker_base_isdefined (&(*request)->super.super.super.obj_class, sizeof(opal_class_t *));
opal_memchecker_base_isdefined ((void*)&(*request)->super.super.super.obj_reference_count, sizeof(volatile int32_t)); opal_memchecker_base_isdefined ((void*)&(*request)->super.super.super.obj_reference_count, sizeof(volatile int32_t));
@ -358,6 +361,10 @@ static inline int memchecker_request(MPI_Request *request)
#ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
static inline int memchecker_status(MPI_Status *status) static inline int memchecker_status(MPI_Status *status)
{ {
if (!opal_memchecker_base_runindebugger()) {
return OMPI_SUCCESS;
}
opal_memchecker_base_isdefined (&status->MPI_SOURCE, sizeof(int)); opal_memchecker_base_isdefined (&status->MPI_SOURCE, sizeof(int));
opal_memchecker_base_isdefined (&status->MPI_TAG, sizeof(int)); opal_memchecker_base_isdefined (&status->MPI_TAG, sizeof(int));
opal_memchecker_base_isdefined (&status->MPI_ERROR, sizeof(int)); opal_memchecker_base_isdefined (&status->MPI_ERROR, sizeof(int));
@ -377,6 +384,10 @@ static inline int memchecker_status(MPI_Status *status)
#ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
static inline int memchecker_datatype(MPI_Datatype type) static inline int memchecker_datatype(MPI_Datatype type)
{ {
if (!opal_memchecker_base_runindebugger()) {
return OMPI_SUCCESS;
}
/* the data description.*/ /* the data description.*/
opal_memchecker_base_isdefined (&type->size, sizeof(size_t)); opal_memchecker_base_isdefined (&type->size, sizeof(size_t));
opal_memchecker_base_isdefined (&type->align, sizeof(uint32_t)); opal_memchecker_base_isdefined (&type->align, sizeof(uint32_t));

Просмотреть файл

@ -49,7 +49,7 @@ int MPI_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
memchecker_datatype(recvtype); memchecker_datatype(recvtype);
for ( i = 0; i < size; i++ ) { for ( i = 0; i < size; i++ ) {
memchecker_call(&opal_memchecker_base_isdefined, sendbuf+sdispls[i], sendcounts[i], sendtype); memchecker_call(&opal_memchecker_base_isdefined, (char*)sendbuf+sdispls[i], sendcounts[i], sendtype);
memchecker_comm(comm); memchecker_comm(comm);
} }
); );

Просмотреть файл

@ -47,7 +47,7 @@ int MPI_Alltoallw(void *sendbuf, int *sendcounts, int *sdispls,
for ( i = 0; i < size; i++ ) { for ( i = 0; i < size; i++ ) {
memchecker_datatype(sendtypes[i]); memchecker_datatype(sendtypes[i]);
memchecker_datatype(recvtypes[i]); memchecker_datatype(recvtypes[i]);
memchecker_call(&opal_memchecker_base_isdefined, sendbuf+sdispls[i], sendcounts[i], sendtypes[i]); memchecker_call(&opal_memchecker_base_isdefined, (char*)sendbuf+sdispls[i], sendcounts[i], sendtypes[i]);
memchecker_comm(comm); memchecker_comm(comm);
} }
); );

Просмотреть файл

@ -98,6 +98,18 @@ OPAL_DECLSPEC extern const opal_memchecker_base_module_1_0_0_t
*/ */
extern int opal_memchecker_base_output; extern int opal_memchecker_base_output;
/**
* Check if we are running under the memory debugger.
*
* @retval 0 if not running under memory debugger
* !=0 if running under memory debugger
*
*/
OPAL_DECLSPEC int opal_memchecker_base_runindebugger(void);
#if OMPI_WANT_MEMCHECKER == 0
#define opal_memchecker_base_runindebugger()
#endif
/** /**
* Check if a memory region is valid to address * Check if a memory region is valid to address

Просмотреть файл

@ -18,6 +18,11 @@
#include "opal/mca/memchecker/memchecker.h" #include "opal/mca/memchecker/memchecker.h"
#include "opal/mca/memchecker/base/base.h" #include "opal/mca/memchecker/base/base.h"
int opal_memchecker_base_runindebugger(void)
{
return opal_memchecker_base_module->runindebugger();
}
int opal_memchecker_base_isaddressible(void * p, size_t len) int opal_memchecker_base_isaddressible(void * p, size_t len)
{ {
return opal_memchecker_base_module->isaddressible(p, len); return opal_memchecker_base_module->isaddressible(p, len);

Просмотреть файл

@ -52,6 +52,12 @@ typedef const struct opal_memchecker_base_module_1_0_0_t *
*/ */
typedef int (*opal_memchecker_base_module_init_1_0_0_fn_t)(void); typedef int (*opal_memchecker_base_module_init_1_0_0_fn_t)(void);
/**
* Module function to query, whether we're under the memory
* checking program, like valgrind
*/
typedef int (*opal_memchecker_base_module_runindebugger_fn_t)(void);
/** /**
* Module function to check, whether memory region is addressible * Module function to check, whether memory region is addressible
*/ */
@ -136,6 +142,9 @@ struct opal_memchecker_base_module_1_0_0_t {
/** Module initialization function */ /** Module initialization function */
opal_memchecker_base_module_init_1_0_0_fn_t init; opal_memchecker_base_module_init_1_0_0_fn_t init;
/** Module function to check, whether we are executed by memory debugger */
opal_memchecker_base_module_runindebugger_fn_t runindebugger;
/** Module function to check, whether memory region is addressible */ /** Module function to check, whether memory region is addressible */
opal_memchecker_base_module_isaddressible_fn_t isaddressible; opal_memchecker_base_module_isaddressible_fn_t isaddressible;

Просмотреть файл

@ -31,6 +31,7 @@
* Local functions * Local functions
*/ */
static int valgrind_module_init(void); static int valgrind_module_init(void);
static int valgrind_module_runindebugger(void);
static int valgrind_module_isaddressible(void * p, size_t len); static int valgrind_module_isaddressible(void * p, size_t len);
static int valgrind_module_isdefined(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_noaccess(void * p, size_t len);
@ -40,8 +41,11 @@ static int valgrind_module_mem_defined_if_addressible(void * p, size_t len);
static int valgrind_module_create_block(void * p, size_t len, char * description); 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_discard_block(void * p); /* Here, we need to do some mapping for valgrind */
static int valgrind_module_leakcheck(void); 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_get_vbits(void * p, char * vbits, size_t len);
static int valgrind_module_set_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 * Valgrind memchecker module
*/ */
@ -52,6 +56,7 @@ static const opal_memchecker_base_module_1_0_0_t module = {
valgrind_module_init, valgrind_module_init,
/* Module function pointers */ /* Module function pointers */
valgrind_module_runindebugger,
valgrind_module_isaddressible, valgrind_module_isaddressible,
valgrind_module_isdefined, valgrind_module_isdefined,
valgrind_module_mem_noaccess, valgrind_module_mem_noaccess,
@ -84,6 +89,12 @@ static int valgrind_module_init(void)
} }
static int valgrind_module_runindebugger(void)
{
return RUNNING_ON_VALGRIND;
}
static int valgrind_module_isaddressible(void * p, size_t len) static int valgrind_module_isaddressible(void * p, size_t len)
{ {
if (len > 0) { if (len > 0) {
@ -173,6 +184,7 @@ 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_get_vbits(void * p, char * vbits, size_t len)
{ {
if (len > 0) { if (len > 0) {
@ -191,3 +203,5 @@ static int valgrind_module_set_vbits(void * p, char * vbits, size_t len)
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
#endif