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); }; }