factor/vm/sampling_profiler.hpp

65 lines
1.6 KiB
C++

namespace factor
{
struct profiling_sample_count
{
// Number of samples taken before the safepoint that recorded the sample
fixnum sample_count;
// Number of samples taken during GC
fixnum gc_sample_count;
// Number of samples taken during unoptimized compiler
fixnum jit_sample_count;
// Number of samples taken during foreign code execution
fixnum foreign_sample_count;
// Number of samples taken during code execution in non-Factor threads
fixnum foreign_thread_sample_count;
profiling_sample_count() :
sample_count(0),
gc_sample_count(0),
jit_sample_count(0),
foreign_sample_count(0),
foreign_thread_sample_count(0) {}
profiling_sample_count(fixnum sample_count,
fixnum gc_sample_count,
fixnum jit_sample_count,
fixnum foreign_sample_count,
fixnum foreign_thread_sample_count) :
sample_count(sample_count),
gc_sample_count(gc_sample_count),
jit_sample_count(jit_sample_count),
foreign_sample_count(foreign_sample_count),
foreign_thread_sample_count(foreign_thread_sample_count) {}
bool empty() const
{
return sample_count
+ gc_sample_count
+ jit_sample_count
+ foreign_sample_count
+ foreign_thread_sample_count == 0;
}
profiling_sample_count record_counts() volatile;
void clear() volatile;
};
struct profiling_sample
{
// Sample counts
profiling_sample_count counts;
// Active thread during sample
cell thread;
/* The callstack at safepoint time. Indexes to the beginning and ending
code_block entries in the vm sample_callstacks array. */
cell callstack_begin, callstack_end;
profiling_sample(factor_vm *vm,
bool prolog_p,
profiling_sample_count const &counts,
cell thread);
};
}