HPCToolkit
thread_data.c
Go to the documentation of this file.
1 // -*-Mode: C++;-*- // technically C99
2 
3 // * BeginRiceCopyright *****************************************************
4 //
5 // $HeadURL$
6 // $Id$
7 //
8 // --------------------------------------------------------------------------
9 // Part of HPCToolkit (hpctoolkit.org)
10 //
11 // Information about sources of support for research and development of
12 // HPCToolkit is at 'hpctoolkit.org' and in 'README.Acknowledgments'.
13 // --------------------------------------------------------------------------
14 //
15 // Copyright ((c)) 2002-2019, Rice University
16 // All rights reserved.
17 //
18 // Redistribution and use in source and binary forms, with or without
19 // modification, are permitted provided that the following conditions are
20 // met:
21 //
22 // * Redistributions of source code must retain the above copyright
23 // notice, this list of conditions and the following disclaimer.
24 //
25 // * Redistributions in binary form must reproduce the above copyright
26 // notice, this list of conditions and the following disclaimer in the
27 // documentation and/or other materials provided with the distribution.
28 //
29 // * Neither the name of Rice University (RICE) nor the names of its
30 // contributors may be used to endorse or promote products derived from
31 // this software without specific prior written permission.
32 //
33 // This software is provided by RICE and contributors "as is" and any
34 // express or implied warranties, including, but not limited to, the
35 // implied warranties of merchantability and fitness for a particular
36 // purpose are disclaimed. In no event shall RICE or contributors be
37 // liable for any direct, indirect, incidental, special, exemplary, or
38 // consequential damages (including, but not limited to, procurement of
39 // substitute goods or services; loss of use, data, or profits; or
40 // business interruption) however caused and on any theory of liability,
41 // whether in contract, strict liability, or tort (including negligence
42 // or otherwise) arising in any way out of the use of this software, even
43 // if advised of the possibility of such damage.
44 //
45 // ******************************************************* EndRiceCopyright *
46 
47 //
48 //
49 
50 //************************* System Include Files ****************************
51 
52 #include <assert.h>
53 #include <pthread.h>
54 #include <stdlib.h>
55 
56 //************************ libmonitor Include Files *************************
57 
58 #include <monitor.h>
59 
60 //*************************** User Include Files ****************************
61 
62 #include "newmem.h"
63 #include "epoch.h"
64 #include "handling_sample.h"
65 
66 #include "thread_data.h"
67 #include "trace.h"
68 
69 #include <lush/lush-pthread.h>
70 #include <messages/messages.h>
72 #include <memory/mmap.h>
73 
74 //***************************************************************************
75 
79 };
80 
81 
82 //***************************************************************************
83 //
84 //***************************************************************************
85 
86 #ifdef USE_GCC_THREAD
87 __thread int monitor_tid = -1;
88 #endif // USE_GCC_THREAD
89 
91 static pthread_key_t _hpcrun_key;
92 static int use_getspecific = 0;
93 
94 
95 void
97 {
98  TMSG(THREAD_SPECIFIC,"creating _hpcrun_key");
99  int bad = pthread_key_create(&_hpcrun_key, NULL);
100  if (bad){
101  EMSG("pthread_key_create returned non-zero = %d",bad);
102  }
103  use_getspecific = 1;
104 }
105 
106 
107 void
109 {
110  TMSG(THREAD_SPECIFIC,"set thread0 data");
111  hpcrun_set_thread_data(&_local_td);
112 }
113 
114 
115 void
117 {
118  TMSG(THREAD_SPECIFIC,"setting td");
119  pthread_setspecific(_hpcrun_key, (void *) td);
120 }
121 
122 
123 //***************************************************************************
124 
125 static thread_data_t*
127 {
128  return &_local_td;
129 }
130 
131 
132 static bool
134 {
135  return true;
136 }
137 
138 
141 {
142  if (use_getspecific) {
143  return (thread_data_t *) pthread_getspecific(_hpcrun_key);
144  }
145  else {
147  }
148 }
149 
150 static thread_data_t*
152 {
153  thread_data_t *ret = (thread_data_t *) pthread_getspecific(_hpcrun_key);
154  if (!ret){
156  }
157  return ret;
158 }
159 
160 static bool
162 {
163  thread_data_t *ret = (thread_data_t *) pthread_getspecific(_hpcrun_key);
164  return !(ret == NULL);
165 }
166 
167 
168 thread_data_t* (*hpcrun_get_thread_data)(void) = &hpcrun_get_thread_data_local;
170 
171 #if 0
172 static inline
175 {
176  if (hpcrun_use_thread_data_local) {
178  }
179  else {
181  }
182 }
183 #endif
184 
185 
186 void
188 {
191 }
192 
193 
194 void
196 {
200 }
201 
202 
203 //***************************************************************************
204 //
205 //***************************************************************************
206 
209 {
210  TMSG(THREAD_SPECIFIC,"malloc thread data for thread %d", id);
211  return hpcrun_mmap_anon(sizeof(thread_data_t));
212 }
213 
214 static inline void
216 {
217 
218  // ----------------------------------------
219  // id
220  // ----------------------------------------
221  cptd->id = id;
222  // ----------------------------------------
223  // epoch: loadmap + cct + cct_ctxt
224  // ----------------------------------------
225 
226  // ----------------------------------------
227  cptd->epoch = hpcrun_malloc(sizeof(epoch_t));
228  cptd->epoch->csdata_ctxt = copy_thr_ctxt(thr_ctxt);
229 
230  // ----------------------------------------
231  // cct2metrics map: associate a metric_set with
232  // a cct node
234 
235  // ----------------------------------------
236  // tracing
237  // ----------------------------------------
238  cptd->trace_min_time_us = 0;
239  cptd->trace_max_time_us = 0;
240 
241  // ----------------------------------------
242  // IO support
243  // ----------------------------------------
244  cptd->hpcrun_file = NULL;
245  cptd->trace_buffer = NULL;
246 
247  // ----------------------------------------
248  // perf event support
249  // ----------------------------------------
250  cptd->perf_event_info = NULL;
251 }
252 
253 
254 #ifdef ENABLE_CUDA
255 static inline void gpu_data_init(gpu_data_t * gpu_data)
256 {
257  gpu_data->is_thread_at_cuda_sync = false;
258  gpu_data->overload_state = 0;
259  gpu_data->accum_num_sync_threads = 0;
260  gpu_data->accum_num_sync_threads = 0;
261 }
262 #endif
263 
264 void
265 hpcrun_thread_data_init(int id, cct_ctxt_t* thr_ctxt, int is_child, size_t n_sources)
266 {
267  hpcrun_meminfo_t memstore;
269 
270  // ----------------------------------------
271  // memstore for hpcrun_malloc()
272  // ----------------------------------------
273 
274  // Wipe the thread data with a bogus bit pattern, but save the
275  // memstore so we can reuse it in the child after fork. This must
276  // come first.
277  td->inside_hpcrun = 1;
278  memstore = td->memstore;
279  memset(td, 0xfe, sizeof(thread_data_t));
280  td->inside_hpcrun = 1;
281  td->memstore = memstore;
282  hpcrun_make_memstore(&td->memstore, is_child);
283  td->mem_low = 0;
284 
285  // ----------------------------------------
286  // normalized thread id (monitor-generated)
287  // ----------------------------------------
289 
290  td->idle = 0; // begin at work
291 
292  // ----------------------------------------
293  // sample sources
294  // ----------------------------------------
295 
296 
297  // allocate ss_state, ss_info
298 
299  td->ss_state = hpcrun_malloc(n_sources * sizeof(source_state_t));
300  td->ss_info = hpcrun_malloc(n_sources * sizeof(source_info_t));
301 
302  // initialize ss_state,info
303 
304  memset(td->ss_state, UNINIT, n_sources * sizeof(source_state_t));
305  memset(td->ss_info, 0, n_sources * sizeof(source_info_t));
306 
307  td->timer_init = false;
308  td->last_time_us = 0;
309 
310 
311  // ----------------------------------------
312  // backtrace buffer
313  // ----------------------------------------
314  td->btbuf_cur = NULL;
317  td->btbuf_sav = td->btbuf_end; // FIXME: is this needed?
318 
320 
321  // ----------------------------------------
322  // trampoline
323  // ----------------------------------------
324  td->tramp_present = false;
325  td->tramp_retn_addr = NULL;
326  td->tramp_loc = NULL;
327  td->cached_bt = hpcrun_malloc(sizeof(frame_t)
329  td->cached_bt_end = td->cached_bt;
331  td->tramp_frame = NULL;
332  td->tramp_cct_node = NULL;
333 
334  // ----------------------------------------
335  // exception stuff
336  // ----------------------------------------
337  td->current_jmp_buf = NULL;
338  memset(&td->bad_interval, 0, sizeof(td->bad_interval));
339  memset(&td->bad_unwind, 0, sizeof(td->bad_unwind));
340 
341  td->deadlock_drop = false;
342  hpcrun_init_handling_sample(td, 0, id);
343  td->fnbounds_lock = 0;
344 
345  // ----------------------------------------
346  // Logical unwinding
347  // ----------------------------------------
350 
351 
352  // ----------------------------------------
353  // debug support
354  // ----------------------------------------
355  td->debug1 = false;
356 
357  // ----------------------------------------
358  // miscellaneous
359  // ----------------------------------------
360  td->inside_dlfcn = false;
361 
362 #ifdef ENABLE_CUDA
363  gpu_data_init(&(td->gpu_data));
364 #endif
365 }
366 
367 
368 //***************************************************************************
369 //
370 //***************************************************************************
371 
372 void
374 {
376  if ((td->cached_bt_buf_end - td->cached_bt) >= n) {
377  return; // cached backtrace buffer is already big enough
378  }
379 
380  frame_t* newbuf = hpcrun_malloc(n * sizeof(frame_t));
381  memcpy(newbuf, td->cached_bt, (void*)td->cached_bt_buf_end - (void*)td->cached_bt);
382  size_t idx = td->cached_bt_end - td->cached_bt;
383  td->cached_bt = newbuf;
384  td->cached_bt_buf_end = newbuf+n;
385  td->cached_bt_end = newbuf + idx;
386 }
387 
388 
389 frame_t*
391 {
393  frame_t* unwind = td->btbuf_cur;
394 
395  /* how big is the current buffer? */
396  size_t sz = td->btbuf_end - td->btbuf_beg;
397  size_t newsz = sz*2;
398  /* how big is the current backtrace? */
399  size_t btsz = td->btbuf_end - td->btbuf_sav;
400  /* how big is the backtrace we're recording? */
401  size_t recsz = unwind - td->btbuf_beg;
402  /* get new buffer */
403  TMSG(EPOCH," epoch_expand_buffer");
404  frame_t *newbt = hpcrun_malloc(newsz*sizeof(frame_t));
405 
406  if(td->btbuf_sav > td->btbuf_end) {
407  EMSG("Invariant btbuf_sav > btbuf_end violated");
409  }
410 
411  /* copy frames from old to new */
412  memcpy(newbt, td->btbuf_beg, recsz*sizeof(frame_t));
413  memcpy(newbt+newsz-btsz, td->btbuf_end-btsz, btsz*sizeof(frame_t));
414 
415  /* setup new pointers */
416  td->btbuf_beg = newbt;
417  td->btbuf_end = newbt+newsz;
418  td->btbuf_sav = newbt+newsz-btsz;
419 
420  /* return new unwind pointer */
421  return newbt+recsz;
422 }
423 
424 
425 void
427 {
429  if (td->btbuf_cur == td->btbuf_end) {
431  td->btbuf_sav = td->btbuf_end;
432  }
433 }
434 
cct_ctxt_t * csdata_ctxt
Definition: epoch.h:66
void hpcrun_cct2metrics_init(cct2metrics_t **map)
Definition: cct2metrics.c:52
uint8_t overload_state
Definition: thread_data.h:81
void hpcrun_init_pthread_key(void)
Definition: thread_data.c:96
static pthread_key_t _hpcrun_key
Definition: thread_data.c:91
thread_data_t * hpcrun_safe_get_td(void)
Definition: thread_data.c:140
source_state_t
void hpcrun_set_thread0_data(void)
Definition: thread_data.c:108
metric_aux_info_t * perf_event_info
bool deadlock_drop
Definition: thread_data.h:215
void hpcrun_set_thread_data(thread_data_t *td)
Definition: thread_data.c:116
bool is_thread_at_cuda_sync
Definition: thread_data.h:79
static size_t n_sources
void hpcrun_cached_bt_adjust_size(size_t n)
Definition: thread_data.c:373
lushPthr_t pthr_metrics
Definition: thread_data.h:222
frame_t * cached_bt_buf_end
Definition: thread_data.h:204
void hpcrun_ensure_btbuf_avail(void)
Definition: thread_data.c:426
void * tramp_loc
Definition: thread_data.h:200
frame_t * cached_bt_end
Definition: thread_data.h:203
frame_t * btbuf_cur
Definition: thread_data.h:184
static int use_getspecific
Definition: thread_data.c:92
sigjmp_buf_t bad_unwind
Definition: thread_data.h:213
static bool hpcrun_get_thread_data_local_avail(void)
Definition: thread_data.c:133
void hpcrun_thread_data_init(int id, cct_ctxt_t *thr_ctxt, int is_child, size_t n_sources)
Definition: thread_data.c:265
void lushPthr_init(lushPthr_t *x)
Definition: lush-pthread.c:190
void * tramp_retn_addr
Definition: thread_data.h:199
bool(* hpcrun_td_avail)(void)
Definition: thread_data.c:169
void hpcrun_bt_init(backtrace_t *bt, size_t size)
Definition: backtrace.c:142
frame_t * cached_bt
Definition: thread_data.h:202
static void core_profile_trace_data_init(core_profile_trace_data_t *cptd, int id, cct_ctxt_t *thr_ctxt)
Definition: thread_data.c:215
frame_t * tramp_frame
Definition: thread_data.h:205
sigjmp_buf_t bad_interval
Definition: thread_data.h:212
static thread_data_t * hpcrun_get_thread_data_local(void)
Definition: thread_data.c:126
cct_ctxt_t * copy_thr_ctxt(cct_ctxt_t *thr_ctxt)
Definition: cct_ctxt.c:77
void hpcrun_threaded_data(void)
Definition: thread_data.c:195
frame_t * btbuf_sav
Definition: thread_data.h:190
frame_t * hpcrun_expand_btbuf(void)
Definition: thread_data.c:390
#define EMSG
Definition: messages.h:70
source_state_t * ss_state
Definition: thread_data.h:150
static void * hpcrun_mmap_anon(size_t size)
Definition: mem.c:156
static thread_data_t * hpcrun_get_thread_data_specific(void)
Definition: thread_data.c:151
core_profile_trace_data_t core_profile_trace_data
Definition: thread_data.h:168
sigjmp_buf_t * current_jmp_buf
Definition: thread_data.h:211
Definition: epoch.h:64
void * hpcrun_malloc(size_t size)
Definition: mem.c:275
bool tramp_present
Definition: thread_data.h:198
cct_node_t * tramp_cct_node
Definition: thread_data.h:206
_local_int_const
Definition: thread_data.c:76
void hpcrun_make_memstore(hpcrun_meminfo_t *mi, int is_child)
Definition: mem.c:224
#define TMSG(f,...)
Definition: messages.h:93
static bool hpcrun_get_thread_data_specific_avail(void)
Definition: thread_data.c:161
static void lushPthr_thread_init(lushPthr_t *x)
void hpcrun_unthreaded_data(void)
Definition: thread_data.c:187
uint64_t accum_num_sync_threads
Definition: thread_data.h:88
#define NULL
Definition: ElfHelper.cpp:85
uint64_t last_time_us
Definition: thread_data.h:157
hpcrun_meminfo_t memstore
Definition: thread_data.h:143
static thread_data_t _local_td
Definition: thread_data.c:90
frame_t * btbuf_beg
Definition: thread_data.h:185
Definition: frame.h:58
<!-- ********************************************************************--> n<!-- HPCToolkit Experiment DTD --> n<!-- Version 2.1 --> n<!-- ********************************************************************--> n<!ELEMENT HPCToolkitExperiment(Header,(SecCallPathProfile|SecFlatProfile) *)> n<!ATTLIST HPCToolkitExperiment\n version CDATA #REQUIRED > n n<!-- ******************************************************************--> n n<!-- Info/NV:flexible name-value pairs:(n) ame;(t) ype;(v) alue --> n<!ELEMENT Info(NV *)> n<!ATTLIST Info\n n CDATA #IMPLIED > n<!ELEMENT NV EMPTY > n<!ATTLIST NV\n n CDATA #REQUIRED\n t CDATA #IMPLIED\n v CDATA #REQUIRED > n n<!-- ******************************************************************--> n<!-- Header --> n<!-- ******************************************************************--> n<!ELEMENT Header(Info *)> n<!ATTLIST Header\n n CDATA #REQUIRED > n n<!-- ******************************************************************--> n<!-- Section Header --> n<!-- ******************************************************************--> n<!ELEMENT SecHeader(MetricTable?, MetricDBTable?, TraceDBTable?, LoadModuleTable?, FileTable?, ProcedureTable?, Info *)> n n<!-- MetricTable:--> n<!ELEMENT MetricTable(Metric) * > n n<!-- Metric:(i) d;(n) ame --> n<!--(v) alue-type:transient type of values --> n<!--(t) ype:persistent type of metric --> n<!-- fmt:format;show;--> n<!ELEMENT Metric(MetricFormula *, Info?)> n<!ATTLIST Metric\n i CDATA #REQUIRED\n n CDATA #REQUIRED\n es CDATA #IMPLIED\n em CDATA #IMPLIED\n ep CDATA #IMPLIED\n v(raw|final|derived-incr|derived) \"raw\\ t (inclusive|exclusive|nil) \nil\\ partner CDATA #IMPLIED\ fmt CDATA #IMPLIED\ show (1|0) \1\\ show-percent (1|0) \1> n n<!-- MetricFormula represents derived metrics: (t)ype; (frm): formula --> n<!ELEMENT MetricFormula (Info?)> n<!ATTLIST MetricFormula\ t (combine|finalize) \finalize\\ i CDATA #IMPLIED\ frm CDATA #REQUIRED> n n<!-- Metric data, used in sections: (n)ame [from Metric]; (v)alue --> n<!ELEMENT M EMPTY> n<!ATTLIST M\ n CDATA #REQUIRED\ v CDATA #REQUIRED> n n<!-- MetricDBTable: --> n<!ELEMENT MetricDBTable (MetricDB)*> n n<!-- MetricDB: (i)d; (n)ame --> n<!-- (t)ype: persistent type of metric --> n<!-- db-glob: file glob describing files in metric db --> n<!-- db-id: id within metric db --> n<!-- db-num-metrics: number of metrics in db --> n<!-- db-header-sz: size (in bytes) of a db file header --> n<!ELEMENT MetricDB EMPTY> n<!ATTLIST MetricDB\ i CDATA #REQUIRED\ n CDATA #REQUIRED\ t (inclusive|exclusive|nil) \nil\\ partner CDATA #IMPLIED\ db-glob CDATA #IMPLIED\ db-id CDATA #IMPLIED\ db-num-metrics CDATA #IMPLIED\ db-header-sz CDATA #IMPLIED> n n<!-- TraceDBTable: --> n<!ELEMENT TraceDBTable (TraceDB)> n n<!-- TraceDB: (i)d --> n<!-- db-min-time: min beginning time stamp (global) --> n<!-- db-max-time: max ending time stamp (global) --> n<!ELEMENT TraceDB EMPTY> n<!ATTLIST TraceDB\ i CDATA #REQUIRED\ db-glob CDATA #IMPLIED\ db-min-time CDATA #IMPLIED\ db-max-time CDATA #IMPLIED\ db-header-sz CDATA #IMPLIED> n n<!-- LoadModuleTable assigns a short name to a load module --> n<!ELEMENT LoadModuleTable (LoadModule)*> n n<!ELEMENT LoadModule (Info?)> n<!ATTLIST LoadModule\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!-- FileTable assigns a short name to a file --> n<!ELEMENT FileTable (File)*> n n<!ELEMENT File (Info?)> n<!ATTLIST File\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!-- ProcedureTable assigns a short name to a procedure --> n<!ELEMENT ProcedureTable (Procedure)*> n n<!-- Info/NV: flexible name-value pairs: (n)ame; (t)ype; (v)alue --> n<!-- f: family of the procedure (fake, root, ...)--> n<!ELEMENT Procedure (Info?)> n<!ATTLIST Procedure\ i CDATA #REQUIRED\ n CDATA #REQUIRED\ f CDATA #IMPLIED> n n<!-- ****************************************************************** --> n<!-- Section: Call path profile --> n<!-- ****************************************************************** --> n<!ELEMENT SecCallPathProfile (SecHeader, SecCallPathProfileData)> n<!ATTLIST SecCallPathProfile\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!ELEMENT SecCallPathProfileData (PF|M)*> n<!-- Procedure frame --> n<!-- (i)d: unique identifier for cross referencing --> n<!-- (s)tatic scope id --> n<!-- (n)ame: a string or an id in ProcedureTable --> n<!-- (lm) load module: a string or an id in LoadModuleTable --> n<!-- (f)ile name: a string or an id in LoadModuleTable --> n<!-- (l)ine range: \beg-end\ (inclusive range) --> n<!-- (a)lien: whether frame is alien to enclosing P --> n<!-- (str)uct: hpcstruct node id --> n<!-- (t)ype: hpcrun node type: memory access, variable declaration, ... --> n<!-- (v)ma-range-set: \{[beg-end), [beg-end)...}\ --> n<!ELEMENT PF (PF|Pr|L|C|S|M)*> n<!ATTLIST PF\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ n CDATA #REQUIRED\ lm CDATA #IMPLIED\ f CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Procedure (static): GOAL: replace with 'P' --> n<!ELEMENT Pr (Pr|L|C|S|M)*> n<!ATTLIST Pr\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ n CDATA #REQUIRED\ lm CDATA #IMPLIED\ f CDATA #IMPLIED\ l CDATA #IMPLIED\ a (1|0) \0\\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Callsite (a special StatementRange) --> n<!ELEMENT C (PF|M)*> n<!ATTLIST C\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n n<!-- ****************************************************************** --> n<!-- Section: Flat profile --> n<!-- ****************************************************************** --> n<!ELEMENT SecFlatProfile (SecHeader, SecFlatProfileData)> n<!ATTLIST SecFlatProfile\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!ELEMENT SecFlatProfileData (LM|M)*> n<!-- Load module: (i)d; (n)ame; (v)ma-range-set --> n<!ELEMENT LM (F|P|M)*> n<!ATTLIST LM\ i CDATA #IMPLIED\ n CDATA #REQUIRED\ v CDATA #IMPLIED> n<!-- File --> n<!ELEMENT F (P|L|S|M)*> n<!ATTLIST F\ i CDATA #IMPLIED\ n CDATA #REQUIRED> n<!-- Procedure (Note 1) --> n<!ELEMENT P (P|A|L|S|C|M)*> n<!ATTLIST P\ i CDATA #IMPLIED\ n CDATA #REQUIRED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Alien (Note 1) --> n<!ELEMENT A (A|L|S|C|M)*> n<!ATTLIST A\ i CDATA #IMPLIED\ f CDATA #IMPLIED\ n CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Loop (Note 1,2) --> n<!ELEMENT L (A|Pr|L|S|C|M)*> n<!ATTLIST L\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ f CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Statement (Note 2) --> n<!-- (it): trace record identifier --> n<!ELEMENT S (S|M)*> n<!ATTLIST S\ i CDATA #IMPLIED\ it CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Note 1: Contained Cs may not contain PFs --> n<!-- Note 2: The 's' attribute is not used for flat profiles --> n
void monitor_real_abort(void)
void hpcrun_init_handling_sample(thread_data_t *td, int in, int id)
source_info_t * ss_info
Definition: thread_data.h:151
backtrace_t bt
Definition: thread_data.h:193
frame_t * btbuf_end
Definition: thread_data.h:189
thread_data_t *(* hpcrun_get_thread_data)(void)
Definition: thread_data.c:168
thread_data_t * hpcrun_allocate_thread_data(int id)
Definition: thread_data.c:208