90 for (
Integer i = 0; i < MAX_STACK; ++i)
91 m_funcs_info_indexes[i] = (-1);
96 bool operator<(
const ProfStackInfo& pfi)
const
98 return ::memcmp(m_funcs_info_indexes, pfi.m_funcs_info_indexes, MAX_STACK *
sizeof(
Int32)) < 0;
103 Int32 m_funcs_info_indexes[MAX_STACK];
164 typedef size_t size_type;
165 typedef ptrdiff_t difference_type;
166 typedef _Tp* pointer;
167 typedef const _Tp* const_pointer;
168 typedef _Tp& reference;
169 typedef const _Tp& const_reference;
170 typedef _Tp value_type;
172 template <
typename _Tp1>
175 typedef StaticAlloc<_Tp1> other;
178 StaticAlloc() ARCANE_NOEXCEPT
186 template <
typename _Tp1>
187 StaticAlloc(
const StaticAlloc<_Tp1>&) ARCANE_NOEXCEPT {}
189 ~StaticAlloc() ARCANE_NOEXCEPT {}
191 void construct(pointer __p,
const _Tp& __val)
193 ::new ((
void*)__p) _Tp(__val);
196 void destroy(pointer __p) { __p->~_Tp(); }
198 pointer allocate(size_type ,
const void* = 0)
201 pointer p = &m_buf[m_buf_index];
204 if (m_buf_index >= (
int)(0.9 * MAX_STATIC_ALLOC))
205 cout <<
"** WARNING: allocate near max memory\n";
206 if (m_buf_index >= MAX_STATIC_ALLOC)
207 throw FatalErrorException(
"StaticAlloc",
"max static alloc reached");
210 void deallocate(pointer, size_type)
219 static _Tp m_buf[MAX_STATIC_ALLOC];
220 static int m_buf_index;
234 class SortedProfStackInfo
240 , m_nb_count(nb_count)
246 bool operator<(
const SortedProfStackInfo& pfi)
const
248 return this->m_nb_count > pfi.m_nb_count;
250 const ProfStackInfo& stackInfo()
const {
return m_stack_info; }
251 Int64 nbCount()
const {
return m_nb_count; }
264 class LibUnwindFuncInfos;
265 class LibUnwindStackInfo;
266 class BacktraceFuncInfos;
267 class BacktraceStackInfo;
278 const char* func_name;
293#if defined(ARCCORE_OS_WIN32) || defined(ARCCORE_OS_MACOS)
294 typedef std::map<void*, ProfAddrInfo> AddrMap;
295 typedef std::map<Int64, ProfFuncInfo*> FuncMap;
296 typedef std::map<ProfStackInfo, Int64> StackMap;
305 void printInfos(
bool dump_file);
308 void startProfiling();
309 void addEvent(
void* address,
int overflow_event[MAX_COUNTER],
int nb_overflow_event);
310 void stopProfiling();
315 void setFunctionDepth(
int v);
316 void setPeriod(
int v);
317 void setNbEventBeforeGettingStack(
Integer v) { m_nb_event_before_getting_stack = v; }
318 Int64 nbEventBeforeGettingStack()
const {
return m_nb_event_before_getting_stack; }
324 StackMap m_stack_map;
325 Int64 m_total_event = 0;
326 Int64 m_total_stack = 0;
327 Int64 m_counters[MAX_COUNTER];
328 Int32 m_current_func_info = 0;
329 ProfFuncInfo m_func_info_buffer[MAX_FUNC];
331 Int64 m_nb_event_before_getting_stack = 5000;
332 int m_function_depth = 3;
333 bool m_use_backtrace =
false;
334 bool m_use_libunwind =
false;
335 MonoFuncAddrGetter* m_mono_func_getter =
nullptr;
336 bool m_is_started =
false;
337 IFuncInfoProvider* m_default_func_info_provider =
nullptr;
338 IFuncInfoProvider* m_libunwind_func_info_provider =
nullptr;
339 IFuncInfoProvider* m_backtrace_func_info_provider =
nullptr;
340 IFuncInfoProvider* m_func_info_provider =
nullptr;
344 void _addEvent(
void* address,
int overflow_event[MAX_COUNTER],
int nb_overflow_event,
345 IStackInfoProvider& stack_info,
Integer function_depth);
346 bool _getFunc(
void* addr, FuncAddrInfo&
info);
347 void _sortFunctions(std::set<ProfFuncInfo*, ProfFuncComparer>& sorted_func);
351 ProfFuncInfo* _getNextFuncInfo();
352 ProfFuncInfo& _funcInfoFromIndex(Int32 index) {
return m_func_info_buffer[index]; }
353 void _storeAddress(
void* address,
bool is_counter0,
int overflow_event[MAX_COUNTER],
int nb_overflow_event,
354 bool* do_add,
bool* do_stack,
bool* func_already_added);
355 void _checkNotStarted();