47 extern kmp_omp_struct_info_t __kmp_omp_debug_struct_info;
51 int __kmp_debugging = FALSE;
53 #define offset_and_size_of( structure, field ) \
55 offsetof( structure, field ), \
56 sizeof( ( (structure *) NULL)->field ) \
59 #define offset_and_size_not_available \
62 #define addr_and_size_of( var ) \
64 (kmp_uint64)( & var ), \
68 #define nthr_buffer_size 1024
70 kmp_omp_nthr_info_buffer[ nthr_buffer_size ] =
71 { nthr_buffer_size *
sizeof( kmp_int32 ) };
74 static char func_microtask[] =
"__kmp_invoke_microtask";
75 static char func_fork[] =
"__kmpc_fork_call";
76 static char func_fork_teams[] =
"__kmpc_fork_teams";
81 __kmp_omp_debug_struct_info = {
89 sizeof( kmp_omp_struct_info_t ),
92 addr_and_size_of( __kmp_version_major ),
93 addr_and_size_of( __kmp_version_minor ),
94 addr_and_size_of( __kmp_version_build ),
95 addr_and_size_of( __kmp_openmp_version ),
96 { (kmp_uint64)( __kmp_copyright ) + KMP_VERSION_MAGIC_LEN, 0 },
99 addr_and_size_of( __kmp_threads ),
100 addr_and_size_of( __kmp_root ),
101 addr_and_size_of( __kmp_threads_capacity ),
102 addr_and_size_of( __kmp_monitor ),
103 #if ! KMP_USE_DYNAMIC_LOCK
104 addr_and_size_of( __kmp_user_lock_table ),
106 addr_and_size_of( func_microtask ),
107 addr_and_size_of( func_fork ),
108 addr_and_size_of( func_fork_teams ),
109 addr_and_size_of( __kmp_team_counter ),
110 addr_and_size_of( __kmp_task_counter ),
111 addr_and_size_of( kmp_omp_nthr_info_buffer ),
113 OMP_LOCK_T_SIZE <
sizeof(
void *),
118 sizeof( kmp_base_info_t ),
119 offset_and_size_of( kmp_base_info_t, th_info ),
120 offset_and_size_of( kmp_base_info_t, th_team ),
121 offset_and_size_of( kmp_base_info_t, th_root ),
122 offset_and_size_of( kmp_base_info_t, th_serial_team ),
123 offset_and_size_of( kmp_base_info_t, th_ident ),
124 offset_and_size_of( kmp_base_info_t, th_spin_here ),
125 offset_and_size_of( kmp_base_info_t, th_next_waiting ),
126 offset_and_size_of( kmp_base_info_t, th_task_team ),
127 offset_and_size_of( kmp_base_info_t, th_current_task ),
128 offset_and_size_of( kmp_base_info_t, th_task_state ),
129 offset_and_size_of( kmp_base_info_t, th_bar ),
130 offset_and_size_of( kmp_bstate_t, b_worker_arrived ),
133 offset_and_size_of( kmp_base_info_t, th_teams_microtask),
134 offset_and_size_of( kmp_base_info_t, th_teams_level),
135 offset_and_size_of( kmp_teams_size_t, nteams ),
136 offset_and_size_of( kmp_teams_size_t, nth ),
139 sizeof( kmp_desc_base_t ),
140 offset_and_size_of( kmp_desc_base_t, ds_tid ),
141 offset_and_size_of( kmp_desc_base_t, ds_gtid ),
145 offset_and_size_of( kmp_desc_base_t, ds_thread_id),
147 offset_and_size_of( kmp_desc_base_t, ds_thread),
151 sizeof( kmp_base_team_t ),
152 offset_and_size_of( kmp_base_team_t, t_master_tid ),
153 offset_and_size_of( kmp_base_team_t, t_ident ),
154 offset_and_size_of( kmp_base_team_t, t_parent ),
155 offset_and_size_of( kmp_base_team_t, t_nproc ),
156 offset_and_size_of( kmp_base_team_t, t_threads ),
157 offset_and_size_of( kmp_base_team_t, t_serialized ),
158 offset_and_size_of( kmp_base_team_t, t_id ),
159 offset_and_size_of( kmp_base_team_t, t_pkfn ),
160 offset_and_size_of( kmp_base_team_t, t_task_team ),
161 offset_and_size_of( kmp_base_team_t, t_implicit_task_taskdata ),
162 offset_and_size_of( kmp_base_team_t, t_cancel_request ),
163 offset_and_size_of( kmp_base_team_t, t_bar ),
164 offset_and_size_of( kmp_balign_team_t, b_master_arrived ),
165 offset_and_size_of( kmp_balign_team_t, b_team_arrived ),
168 sizeof( kmp_base_root_t ),
169 offset_and_size_of( kmp_base_root_t, r_root_team ),
170 offset_and_size_of( kmp_base_root_t, r_hot_team ),
171 offset_and_size_of( kmp_base_root_t, r_uber_thread ),
172 offset_and_size_not_available,
176 offset_and_size_of(
ident_t, psource ),
177 offset_and_size_of(
ident_t, flags ),
180 sizeof( kmp_base_queuing_lock_t ),
181 offset_and_size_of( kmp_base_queuing_lock_t, initialized ),
182 offset_and_size_of( kmp_base_queuing_lock_t, location ),
183 offset_and_size_of( kmp_base_queuing_lock_t, tail_id ),
184 offset_and_size_of( kmp_base_queuing_lock_t, head_id ),
185 offset_and_size_of( kmp_base_queuing_lock_t, next_ticket ),
186 offset_and_size_of( kmp_base_queuing_lock_t, now_serving ),
187 offset_and_size_of( kmp_base_queuing_lock_t, owner_id ),
188 offset_and_size_of( kmp_base_queuing_lock_t, depth_locked ),
189 offset_and_size_of( kmp_base_queuing_lock_t, flags ),
191 #if ! KMP_USE_DYNAMIC_LOCK
193 sizeof( kmp_lock_table_t ),
194 offset_and_size_of( kmp_lock_table_t, used ),
195 offset_and_size_of( kmp_lock_table_t, allocated ),
196 offset_and_size_of( kmp_lock_table_t, table ),
200 sizeof( kmp_base_task_team_t ),
201 offset_and_size_of( kmp_base_task_team_t, tt_threads_data ),
202 offset_and_size_of( kmp_base_task_team_t, tt_found_tasks ),
203 offset_and_size_of( kmp_base_task_team_t, tt_nproc ),
204 offset_and_size_of( kmp_base_task_team_t, tt_unfinished_threads ),
205 offset_and_size_of( kmp_base_task_team_t, tt_active ),
208 sizeof( kmp_taskdata_t ),
209 offset_and_size_of( kmp_taskdata_t, td_task_id ),
210 offset_and_size_of( kmp_taskdata_t, td_flags ),
211 offset_and_size_of( kmp_taskdata_t, td_team ),
212 offset_and_size_of( kmp_taskdata_t, td_parent ),
213 offset_and_size_of( kmp_taskdata_t, td_level ),
214 offset_and_size_of( kmp_taskdata_t, td_ident ),
215 offset_and_size_of( kmp_taskdata_t, td_allocated_child_tasks ),
216 offset_and_size_of( kmp_taskdata_t, td_incomplete_child_tasks ),
218 offset_and_size_of( kmp_taskdata_t, td_taskwait_ident ),
219 offset_and_size_of( kmp_taskdata_t, td_taskwait_counter ),
220 offset_and_size_of( kmp_taskdata_t, td_taskwait_thread ),
222 offset_and_size_of( kmp_taskdata_t, td_taskgroup ),
223 offset_and_size_of( kmp_taskgroup_t, count ),
224 offset_and_size_of( kmp_taskgroup_t, cancel_request ),
226 offset_and_size_of( kmp_taskdata_t, td_depnode ),
227 offset_and_size_of( kmp_depnode_list_t, node ),
228 offset_and_size_of( kmp_depnode_list_t, next ),
229 offset_and_size_of( kmp_base_depnode_t, successors ),
230 offset_and_size_of( kmp_base_depnode_t, task ),
231 offset_and_size_of( kmp_base_depnode_t, npredecessors ),
232 offset_and_size_of( kmp_base_depnode_t, nrefs ),
233 offset_and_size_of( kmp_task_t, routine ),
236 sizeof( kmp_thread_data_t ),
237 offset_and_size_of( kmp_base_thread_data_t, td_deque ),
238 offset_and_size_of( kmp_base_thread_data_t, td_deque_head ),
239 offset_and_size_of( kmp_base_thread_data_t, td_deque_tail ),
240 offset_and_size_of( kmp_base_thread_data_t, td_deque_ntasks ),
241 offset_and_size_of( kmp_base_thread_data_t, td_deque_last_stolen ),
248 #undef offset_and_size_of
249 #undef addr_and_size_of
259 __kmp_convert_to_ptr(
263 #pragma warning( push )
264 #pragma warning( disable: 810 ) // conversion from "unsigned long long" to "char *" may lose significant bits
265 #pragma warning( disable: 1195 ) // conversion from integer to smaller pointer
266 #endif // KMP_COMPILER_ICC
267 return (
void *) addr;
269 #pragma warning( pop )
270 #endif // KMP_COMPILER_ICC
277 kmp_omp_nthr_item_t * item
284 char * file = (
char *) __kmp_convert_to_ptr( item->file );
285 char * func = (
char *) __kmp_convert_to_ptr( item->func );
286 file_match = __kmp_str_fname_match( & loc->fname, file );
290 strcmp( func,
"*" ) == 0
292 ( loc->func != NULL && strcmp( loc->func, func ) == 0 );
294 item->begin <= loc->line
296 ( item->end <= 0 || loc->line <= item->end );
298 return ( file_match && func_match && line_match );
304 __kmp_omp_num_threads(
310 kmp_omp_nthr_info_t * info =
311 (kmp_omp_nthr_info_t *) __kmp_convert_to_ptr( __kmp_omp_debug_struct_info.nthr_info.addr );
312 if ( info->num > 0 && info->array != 0 ) {
313 kmp_omp_nthr_item_t * items = (kmp_omp_nthr_item_t *) __kmp_convert_to_ptr( info->array );
314 kmp_str_loc_t loc = __kmp_str_loc_init( ident->
psource, 1 );
316 for ( i = 0; i < info->num; ++ i ) {
317 if ( kmp_location_match( & loc, & items[ i ] ) ) {
318 num_threads = items[ i ].num_threads;
321 __kmp_str_loc_free( & loc );