17 #ifndef OMPI_MEMCHECKER_H
18 #define OMPI_MEMCHECKER_H
20 #include "ompi_config.h"
22 #include "opal/datatype/opal_convertor.h"
23 #include "opal/datatype/opal_datatype.h"
24 #include "opal/datatype/opal_datatype_internal.h"
26 #include "ompi/communicator/communicator.h"
28 #include "ompi/datatype/ompi_datatype.h"
30 #include "opal/mca/memchecker/base/base.h"
33 #if OMPI_WANT_MEMCHECKER
34 # define MEMCHECKER(x) do { \
38 # define MEMCHECKER(x)
42 static inline int memchecker_convertor_call (
int (*f)(
void *,
size_t),
opal_convertor_t* pConvertor)
44 if (!opal_memchecker_base_runindebugger() ||
45 (0 == pConvertor->
count) ) {
49 if( OPAL_LIKELY(pConvertor->
flags & CONVERTOR_NO_OP) ) {
54 uint32_t elem_pos = 0, i;
55 ptrdiff_t stack_disp = 0;
58 unsigned char *source_base = pConvertor->
pBaseBuf;
60 if ( NULL != pConvertor->
pDesc )
63 for (i = 0; i < pConvertor->
count; i++){
64 while ( OPAL_DATATYPE_LOOP == pElem->elem.
common.
flags ) {
66 pElem = &(description[elem_pos]);
69 while( pElem->elem.
common.
flags & OPAL_DATATYPE_FLAG_DATA ) {
71 f( (
void *)(source_base + pElem->elem.
disp), pElem->elem.
count*pElem->elem.
extent );
73 pElem = &(description[elem_pos]);
78 pElem = &(description[elem_pos]);
80 source_base += stack_disp;
92 static inline int memchecker_call (
int (*f)(
void *,
size_t),
void * addr,
95 if (!opal_memchecker_base_runindebugger()) {
101 f( addr , datatype->
super.
size * count );
104 uint32_t elem_pos = 0, i;
105 ptrdiff_t stack_disp = 0;
108 unsigned char *source_base = (
unsigned char *) addr;
110 if ( NULL != datatype ) {
114 for (i = 0; i < count; i++) {
115 while ( OPAL_DATATYPE_LOOP == pElem->elem.
common.
flags ) {
117 pElem = &(description[elem_pos]);
120 while( pElem->elem.
common.
flags & OPAL_DATATYPE_FLAG_DATA ) {
122 f( (
void *)(source_base + pElem->elem.
disp), pElem->elem.
count*pElem->elem.
extent );
124 pElem = &(description[elem_pos]);
129 pElem = &(description[elem_pos]);
131 source_base += stack_disp;
158 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
159 static inline int memchecker_comm(
MPI_Comm comm)
161 if (!opal_memchecker_base_runindebugger()) {
172 opal_memchecker_base_isdefined ((
void*)&comm->c_base.
obj_reference_count,
sizeof(
volatile int32_t));
173 #if OPAL_ENABLE_DEBUG
174 opal_memchecker_base_isdefined (&comm->c_base.obj_magic_id,
sizeof(
opal_object_t));
175 opal_memchecker_base_isdefined (&comm->c_base.cls_init_file_name,
sizeof(
const char *));
176 opal_memchecker_base_isdefined (&comm->c_base.cls_init_lineno,
sizeof(
int));
180 opal_memchecker_base_isdefined ((
void*)&comm->c_lock.super.
obj_reference_count,
sizeof(
volatile int32_t));
181 #if OPAL_ENABLE_DEBUG
182 opal_memchecker_base_isdefined (&comm->c_lock.super.obj_magic_id,
sizeof(uint64_t));
183 opal_memchecker_base_isdefined (&comm->c_lock.super.cls_init_file_name,
sizeof(
const char *));
184 opal_memchecker_base_isdefined (&comm->c_lock.super.cls_init_lineno,
sizeof(
int));
186 #if OPAL_HAVE_POSIX_THREADS
196 #if OPAL_HAVE_SOLARIS_THREADS
197 opal_memchecker_base_isdefined (&comm->c_lock.m_lock_solaris,
sizeof(mutex_t));
203 opal_memchecker_base_isdefined (&comm->c_lock.m_lock_atomic,
sizeof(
opal_atomic_lock_t));
205 opal_memchecker_base_isdefined (&comm->c_name, MPI_MAX_OBJECT_NAME);
206 opal_memchecker_base_isdefined (&comm->c_my_rank,
sizeof(
int));
207 opal_memchecker_base_isdefined (&comm->c_flags,
sizeof(uint32_t));
208 opal_memchecker_base_isdefined (&comm->c_id_available,
sizeof(
int));
209 opal_memchecker_base_isdefined (&comm->c_id_start_index,
sizeof(
int));
210 opal_memchecker_base_isdefined (&comm->c_local_group,
sizeof(
ompi_group_t *));
211 opal_memchecker_base_isdefined (&comm->c_remote_group,
sizeof(
ompi_group_t *));
213 opal_memchecker_base_isdefined (&comm->c_cube_dim,
sizeof(
int));
217 opal_memchecker_base_isdefined (&comm->
c_topo_module,
sizeof(
struct mca_topo_base_module_comm_t *));
218 opal_memchecker_base_isdefined (&comm->c_f_to_c_index,
sizeof(
int));
219 #ifdef OMPI_WANT_PERUSE
220 opal_memchecker_base_isdefined (&comm->c_peruse_handles,
sizeof(
struct ompi_peruse_handle_t **));
222 opal_memchecker_base_isdefined (&comm->error_handler,
sizeof(
ompi_errhandler_t *));
224 opal_memchecker_base_isdefined (&comm->c_pml_comm,
sizeof(
struct mca_pml_comm_t *));
226 opal_memchecker_base_isdefined (&comm->c_coll.coll_module_init,
sizeof(mca_coll_base_module_init_1_0_0_fn_t));
227 opal_memchecker_base_isdefined (&comm->c_coll.coll_module_finalize,
sizeof(mca_coll_base_module_finalize_fn_t));
228 opal_memchecker_base_isdefined (&comm->c_coll.coll_allgather,
sizeof(mca_coll_base_module_allgather_fn_t));
229 opal_memchecker_base_isdefined (&comm->c_coll.coll_allgatherv,
sizeof(mca_coll_base_module_allgatherv_fn_t));
230 opal_memchecker_base_isdefined (&comm->c_coll.coll_allreduce,
sizeof(mca_coll_base_module_allreduce_fn_t));
231 opal_memchecker_base_isdefined (&comm->c_coll.coll_alltoall,
sizeof(mca_coll_base_module_alltoall_fn_t));
232 opal_memchecker_base_isdefined (&comm->c_coll.coll_alltoallv,
sizeof(mca_coll_base_module_alltoallv_fn_t));
233 opal_memchecker_base_isdefined (&comm->c_coll.coll_alltoallw,
sizeof(mca_coll_base_module_alltoallw_fn_t));
234 opal_memchecker_base_isdefined (&comm->c_coll.coll_barrier,
sizeof(mca_coll_base_module_barrier_fn_t));
235 opal_memchecker_base_isdefined (&comm->c_coll.coll_bcast,
sizeof(mca_coll_base_module_bcast_fn_t));
236 opal_memchecker_base_isdefined (&comm->c_coll.coll_exscan,
sizeof(mca_coll_base_module_exscan_fn_t));
237 opal_memchecker_base_isdefined (&comm->c_coll.coll_gather,
sizeof(mca_coll_base_module_gather_fn_t));
238 opal_memchecker_base_isdefined (&comm->c_coll.coll_gatherv,
sizeof(mca_coll_base_module_gatherv_fn_t));
239 opal_memchecker_base_isdefined (&comm->c_coll.coll_reduce,
sizeof(mca_coll_base_module_reduce_fn_t));
240 opal_memchecker_base_isdefined (&comm->c_coll.coll_reduce_scatter,
sizeof(mca_coll_base_module_reduce_scatter_fn_t));
241 opal_memchecker_base_isdefined (&comm->c_coll.coll_scan,
sizeof(mca_coll_base_module_scan_fn_t));
242 opal_memchecker_base_isdefined (&comm->c_coll.coll_scatter,
sizeof(mca_coll_base_module_scatter_fn_t));
243 opal_memchecker_base_isdefined (&comm->c_coll.coll_scatterv,
sizeof(mca_coll_base_module_scatterv_fn_t));
246 opal_memchecker_base_isdefined (&comm->c_coll_selected_module,
sizeof(
const mca_coll_base_module_1_0_0_t *));
249 opal_memchecker_base_isdefined (&comm->c_coll_basic_module,
sizeof(
const mca_coll_base_module_1_0_0_t *));
250 opal_memchecker_base_isdefined (&comm->c_coll_basic_data,
sizeof(
struct mca_coll_base_comm_t *));
255 #define memchecker_comm(comm)
262 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
265 if (!opal_memchecker_base_runindebugger()) {
270 opal_memchecker_base_isdefined (&(*request)->super.super.super.obj_class,
sizeof(
opal_class_t *));
271 opal_memchecker_base_isdefined ((
void*)&(*request)->super.super.super.obj_reference_count,
sizeof(
volatile int32_t));
272 #if OPAL_ENABLE_DEBUG
273 opal_memchecker_base_isdefined (&(*request)->super.super.super.obj_magic_id,
sizeof(uint64_t));
274 opal_memchecker_base_isdefined (&(*request)->super.super.super.cls_init_file_name,
sizeof(
const char *));
275 opal_memchecker_base_isdefined (&(*request)->super.super.super.cls_init_lineno,
sizeof(
int));
278 opal_memchecker_base_isdefined ((
void*)&(*request)->super.super.opal_list_next,
sizeof(
volatile struct opal_list_item_t *));
279 opal_memchecker_base_isdefined ((
void*)&(*request)->super.super.opal_list_prev,
sizeof(
volatile struct opal_list_item_t *));
280 #if OPAL_ENABLE_DEBUG
281 opal_memchecker_base_isdefined ((
void*)&(*request)->super.super.opal_list_item_refcount,
sizeof(
volatile int32_t));
282 opal_memchecker_base_isdefined ((
void*)&(*request)->super.super.opal_list_item_belong_to,
sizeof(
volatile struct opal_list_t *));
286 opal_memchecker_base_isdefined (&(*request)->req_type,
sizeof(ompi_request_type_t));
292 opal_memchecker_base_isdefined (&(*request)->req_status.MPI_SOURCE,
sizeof(
int));
293 opal_memchecker_base_isdefined (&(*request)->req_status.MPI_TAG,
sizeof(
int));
294 opal_memchecker_base_isdefined (&(*request)->req_status.MPI_ERROR,
sizeof(
int));
295 opal_memchecker_base_isdefined (&(*request)->req_status._cancelled,
sizeof(
int));
296 opal_memchecker_base_isdefined (&(*request)->req_status._ucount,
sizeof(
size_t));
299 opal_memchecker_base_isdefined ((
void*)&(*request)->req_complete,
sizeof(
volatile _Bool));
300 opal_memchecker_base_isdefined ((
void*)&(*request)->req_state,
sizeof(
volatile ompi_request_state_t));
301 opal_memchecker_base_isdefined (&(*request)->req_persistent,
sizeof(_Bool));
302 opal_memchecker_base_isdefined (&(*request)->req_f_to_c_index,
sizeof(
int));
303 opal_memchecker_base_isdefined (&(*request)->req_free,
sizeof(ompi_request_free_fn_t));
304 opal_memchecker_base_isdefined (&(*request)->req_cancel,
sizeof(ompi_request_cancel_fn_t));
306 opal_memchecker_base_isdefined (&(*request)->req_mpi_object.comm,
sizeof(
struct ompi_communicator_t *));
307 opal_memchecker_base_isdefined (&(*request)->req_mpi_object.file,
sizeof(
struct ompi_file_t *));
308 opal_memchecker_base_isdefined (&(*request)->req_mpi_object.win,
sizeof(
struct ompi_win_t *));
313 #define memchecker_request(request)
320 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
321 static inline int memchecker_status(
MPI_Status *status)
323 if (!opal_memchecker_base_runindebugger()) {
327 opal_memchecker_base_isdefined (&status->MPI_SOURCE,
sizeof(
int));
328 opal_memchecker_base_isdefined (&status->MPI_TAG,
sizeof(
int));
329 opal_memchecker_base_isdefined (&status->MPI_ERROR,
sizeof(
int));
330 opal_memchecker_base_isdefined (&status->_cancelled,
sizeof(
int));
331 opal_memchecker_base_isdefined (&status->_ucount,
sizeof(
size_t));
336 #define memchecker_status(status)
343 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
344 static inline int memchecker_datatype(
MPI_Datatype type)
346 if (!opal_memchecker_base_runindebugger()) {
351 opal_memchecker_base_isdefined (&type->
super.
flags,
sizeof(uint16_t));
352 opal_memchecker_base_isdefined (&type->
super.
id,
sizeof(uint16_t));
353 opal_memchecker_base_isdefined (&type->
super.
bdt_used,
sizeof(uint32_t));
354 opal_memchecker_base_isdefined (&type->
super.
size,
sizeof(
size_t));
355 opal_memchecker_base_isdefined (&type->
super.
true_lb,
sizeof(OPAL_PTRDIFF_T));
356 opal_memchecker_base_isdefined (&type->
super.
true_ub,
sizeof(OPAL_PTRDIFF_T));
357 opal_memchecker_base_isdefined (&type->
super.
lb,
sizeof(OPAL_PTRDIFF_T));
358 opal_memchecker_base_isdefined (&type->
super.
ub,
sizeof(OPAL_PTRDIFF_T));
359 opal_memchecker_base_isdefined (&type->
super.
align,
sizeof(uint32_t));
360 opal_memchecker_base_isdefined (&type->
super.
nbElems,
sizeof(uint32_t));
362 opal_memchecker_base_isdefined (&type->
super.
desc.
length,
sizeof(opal_datatype_count_t));
363 opal_memchecker_base_isdefined (&type->
super.
desc.
used,
sizeof(opal_datatype_count_t));
365 opal_memchecker_base_isdefined (&type->
super.
opt_desc.
length,
sizeof(opal_datatype_count_t));
366 opal_memchecker_base_isdefined (&type->
super.
opt_desc.
used,
sizeof(opal_datatype_count_t));
368 opal_memchecker_base_isdefined (&type->
super.
btypes, OPAL_DATATYPE_MAX_PREDEFINED *
sizeof(uint32_t));
370 opal_memchecker_base_isdefined (&type->
id,
sizeof(int32_t));
371 opal_memchecker_base_isdefined (&type->
d_f_to_c_index,
sizeof(int32_t));
373 opal_memchecker_base_isdefined (&type->
args,
sizeof(
void *));
375 opal_memchecker_base_isdefined (&type->
name, MPI_MAX_OBJECT_NAME *
sizeof(
char));
380 #define memchecker_datatype(type)
uint16_t flags
the flags
Definition: opal_datatype.h:105
Definition: opal_hash_table.h:42
void * args
Data description for the user.
Definition: ompi_datatype.h:76
OPAL_PTRDIFF_TYPE extent
extent of each block (in bytes)
Definition: opal_datatype_internal.h:161
Common type for all MCA components.
Definition: mca.h:250
uint16_t id
data id, normally the index in the data array.
Definition: opal_datatype.h:106
Definition: opal_datatype_internal.h:184
Definition: ompi_datatype.h:68
uint32_t bdt_used
bitset of which basic datatypes are used in the data description
Definition: opal_datatype.h:107
Back-end type for MPI_Errorhandler.
Definition: errhandler.h:108
Definition: peruse-internal.h:30
opal_datatype_count_t length
the maximum number of elements in the description array
Definition: opal_datatype.h:93
Collective component interface.
Definition: coll.h:283
Cached on ompi_communicator_t to hold queues/state used by the PML<->PTL interface for matching logic...
Definition: pml_bfo_comm.h:51
dt_type_desc_t desc
the data description
Definition: opal_datatype.h:121
struct mca_topo_base_comm_1_0_0_t * c_topo_comm
structure containing basic information about the topology
Definition: communicator.h:155
OPAL_PTRDIFF_TYPE lb
lower bound in memory
Definition: opal_datatype.h:112
OPAL_PTRDIFF_TYPE ub
upper bound in memory
Definition: opal_datatype.h:113
volatile int32_t obj_reference_count
reference count
Definition: opal_object.h:189
ddt_elem_id_description common
basic data description and flags
Definition: opal_datatype_internal.h:158
Volatile lock object (with optional padding).
Definition: atomic.h:102
unsigned char * pBaseBuf
initial buffer as supplied by the user
Definition: opal_convertor.h:101
Definition: opal_list.h:98
Class descriptor.
Definition: opal_object.h:152
const struct mca_topo_base_module_1_0_0_t * c_topo
structure of function pointers
Definition: communicator.h:152
const opal_datatype_t * pDesc
the datatype description associated with the convertor
Definition: opal_convertor.h:96
Top-level description of requests.
uint32_t count
number of blocks
Definition: opal_datatype_internal.h:159
opal_datatype_t super
Base opal_datatype_t superclass.
Definition: ompi_datatype.h:69
Back-end structure for MPI_File.
Definition: file.h:42
uint32_t align
data should be aligned to
Definition: opal_datatype.h:115
struct opal_hash_table_t * d_keyhash
Attribute fields.
Definition: ompi_datatype.h:74
size_t size
total size in bytes of the memory used by the data if the data is put on a contiguous buffer ...
Definition: opal_datatype.h:108
void * packed_description
Packed description of the datatype.
Definition: ompi_datatype.h:77
Group structure Currently we have four formats for storing the process pointers that are members of t...
Definition: group.h:79
char name[MPI_MAX_OBJECT_NAME]
Externally visible name.
Definition: ompi_datatype.h:79
Base object.
Definition: opal_object.h:182
Definition: opal_convertor.h:90
opal_datatype_count_t used
the number of used elements in the description array
Definition: opal_datatype.h:94
const dt_type_desc_t * use_desc
the version used by the convertor (normal or optimized)
Definition: opal_convertor.h:97
Definition: opal_list.h:147
struct mca_topo_base_module_comm_t * c_topo_module
module specific data
Definition: communicator.h:158
uint16_t flags
flags for the record
Definition: opal_datatype_internal.h:149
int32_t d_f_to_c_index
Fortran index for this datatype.
Definition: ompi_datatype.h:73
size_t local_size
overall length data on local machine, compared to bConverted
Definition: opal_convertor.h:94
uint32_t btypes[OPAL_DATATYPE_MAX_SUPPORTED]
basic elements count used to compute the size of the datatype for remote nodes.
Definition: opal_datatype.h:125
int32_t id
OMPI-layers unique id of the type.
Definition: ompi_datatype.h:72
Infrastructure for MPI group support.
OPAL_PTRDIFF_TYPE true_ub
the true ub of the data without user defined lb and ub
Definition: opal_datatype.h:111
opal_datatype_count_t count
the total number of full datatype elements
Definition: opal_convertor.h:98
dt_type_desc_t opt_desc
short description of the data used when conversion is useless or in the send case (without conversion...
Definition: opal_datatype.h:122
uint32_t flags
the properties of this convertor
Definition: opal_convertor.h:93
uint32_t nbElems
total number of elements inside the datatype
Definition: opal_datatype.h:116
Definition: communicator.h:118
Main top-level request struct definition.
Definition: request.h:100
struct opal_hash_table_t * c_keyhash
inscribing cube dimension
Definition: communicator.h:144
OPAL_PTRDIFF_TYPE true_lb
the true lb of the data without user defined lb and ub
Definition: opal_datatype.h:110
ompi_errhandler_type_t
Enum used to describe what kind MPI object an error handler is used for.
Definition: errhandler.h:84
opal_class_t * obj_class
class descriptor
Definition: opal_object.h:188
OPAL_PTRDIFF_TYPE disp
displacement of the first block
Definition: opal_datatype_internal.h:162