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(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(profiling_sample_count const& counts, cell thread, cell callstack_begin, cell callstack_end); }; }