1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef _PERUSE_INTERNAL_H_
14 #define _PERUSE_INTERNAL_H_
15
16 #include "ompi_config.h"
17 #include "ompi/peruse/peruse.h"
18 #include "opal/class/opal_list.h"
19 #include "ompi/communicator/communicator.h"
20 #include "ompi/file/file.h"
21 #include "ompi/win/win.h"
22
23 BEGIN_C_DECLS
24
25 typedef int (ompi_peruse_callback_f)(peruse_event_h event_h,
26 MPI_Aint unique_id, void * spec, void * param);
27
28 OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_peruse_t);
29
30 struct ompi_peruse_handle_t {
31 opal_list_item_t super;
32 opal_mutex_t lock;
33 int active;
34 int event;
35 int type;
36 ompi_communicator_t* comm;
37 ompi_file_t* file;
38 ompi_win_t* win;
39 ompi_peruse_callback_f* fn;
40 void * param;
41 };
42
43 typedef struct ompi_peruse_handle_t ompi_peruse_handle_t;
44 OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_peruse_handle_t);
45
46 enum {
47 PERUSE_TYPE_INVALID=-1,
48 PERUSE_TYPE_COMM,
49 PERUSE_TYPE_FILE,
50 PERUSE_TYPE_WIN
51 };
52
53 extern int ompi_peruse_initialized;
54 extern int ompi_peruse_finalized;
55
56 #define OMPI_ERR_PERUSE_INIT_FINALIZE \
57 if( OPAL_UNLIKELY(!ompi_peruse_initialized || ompi_peruse_finalized) ) { \
58 return PERUSE_ERR_INIT; \
59 }
60
61
62
63
64 int ompi_peruse_init (void);
65 int ompi_peruse_finalize (void);
66
67
68
69
70
71 #if OMPI_WANT_PERUSE
72 #define PERUSE_TRACE_COMM_EVENT(event, base_req, op) \
73 do { \
74 if( NULL != (base_req)->req_comm->c_peruse_handles ) { \
75 ompi_peruse_handle_t * _ptr = (base_req)->req_comm->c_peruse_handles[(event)]; \
76 if (NULL != _ptr && _ptr->active) { \
77 peruse_comm_spec_t _comm_spec; \
78 _comm_spec.comm = (base_req)->req_comm; \
79 _comm_spec.buf = (base_req)->req_addr; \
80 _comm_spec.count = (base_req)->req_count; \
81 _comm_spec.datatype = (base_req)->req_datatype; \
82 _comm_spec.peer = (base_req)->req_peer; \
83 _comm_spec.tag = (base_req)->req_tag; \
84 _comm_spec.operation = (op); \
85 _ptr->fn(_ptr, (MPI_Aint)(base_req), &_comm_spec, _ptr->param); \
86 } \
87 } \
88 } while(0)
89
90 #define PERUSE_TRACE_COMM_OMPI_EVENT(event, base_req, size, op) \
91 do { \
92 if( NULL != (base_req)->req_comm->c_peruse_handles ) { \
93 ompi_peruse_handle_t * _ptr = (base_req)->req_comm->c_peruse_handles[(event)]; \
94 if (NULL != _ptr && _ptr->active) { \
95 peruse_comm_spec_t _comm_spec; \
96 _comm_spec.comm = (base_req)->req_comm; \
97 _comm_spec.buf = (base_req)->req_addr; \
98 _comm_spec.count = size; \
99 _comm_spec.datatype = MPI_PACKED; \
100 _comm_spec.peer = (base_req)->req_peer; \
101 _comm_spec.tag = (base_req)->req_tag; \
102 _comm_spec.operation = (op); \
103 _ptr->fn(_ptr, (MPI_Aint)(base_req), &_comm_spec, _ptr->param); \
104 } \
105 } \
106 } while(0)
107
108 #define PERUSE_TRACE_MSG_EVENT(event, comm_ptr, hdr_peer, hdr_tag, op) \
109 do { \
110 if( NULL != (comm_ptr)->c_peruse_handles ) { \
111 ompi_peruse_handle_t * _ptr = (comm_ptr)->c_peruse_handles[(event)]; \
112 if (NULL != _ptr && _ptr->active) { \
113 peruse_comm_spec_t _comm_spec; \
114 _comm_spec.comm = (ompi_communicator_t*) (comm_ptr); \
115 _comm_spec.buf = NULL; \
116 _comm_spec.count = 0; \
117 _comm_spec.datatype = MPI_DATATYPE_NULL; \
118 _comm_spec.peer = (hdr_peer); \
119 _comm_spec.tag = (hdr_tag); \
120 _comm_spec.operation = (op); \
121 _ptr->fn (_ptr, (MPI_Aint)0, &_comm_spec, _ptr->param); \
122 } \
123 } \
124 } while(0)
125
126 #else
127
128 #define PERUSE_TRACE_COMM_EVENT(event, base_req, op)
129 #define PERUSE_TRACE_COMM_OMPI_EVENT(event, base_req, size, op)
130 #define PERUSE_TRACE_MSG_EVENT(event, comm_ptr, hdr_peer, hdr_tag, op)
131
132 #endif
133
134 END_C_DECLS
135
136 #endif