5 void safepoint_state::enqueue_safepoint(factor_vm* parent) volatile {
6 parent->code->guard_safepoint();
9 void safepoint_state::enqueue_fep(factor_vm* parent) volatile {
11 fatal_error("Low-level debugger interrupted", 0);
12 atomic::store(&fep_p, true);
13 enqueue_safepoint(parent);
16 void safepoint_state::enqueue_samples(factor_vm* parent, cell samples, cell pc,
17 bool foreign_thread_p) volatile {
18 if (atomic::load(&parent->sampling_profiler_p)) {
19 atomic::fetch_add(&sample_counts.sample_count, samples);
21 atomic::fetch_add(&sample_counts.foreign_thread_sample_count, samples);
23 if (atomic::load(&parent->current_gc_p))
24 atomic::fetch_add(&sample_counts.gc_sample_count, samples);
25 if (atomic::load(&parent->current_jit_count) > 0)
26 atomic::fetch_add(&sample_counts.jit_sample_count, samples);
27 if (!parent->code->seg->in_segment_p(pc))
28 atomic::fetch_add(&sample_counts.foreign_sample_count, samples);
30 enqueue_safepoint(parent);
34 void safepoint_state::handle_safepoint(factor_vm* parent, cell pc) volatile {
35 parent->code->unguard_safepoint();
36 parent->faulting_p = false;
38 if (atomic::load(&fep_p)) {
39 if (atomic::load(&parent->sampling_profiler_p))
40 parent->end_sampling_profiler();
41 std::cout << "Interrupted\n";
43 atomic::store(&fep_p, false);
44 } else if (atomic::load(&parent->sampling_profiler_p)) {
45 FACTOR_ASSERT(parent->code->seg->in_segment_p(pc));
46 code_block* block = parent->code->code_block_for_address(pc);
47 bool prolog_p = block->entry_point() == pc;
49 parent->record_sample(prolog_p);