6 void safepoint_state::enqueue_safepoint(factor_vm *parent) volatile
8 parent->code->guard_safepoint();
11 void safepoint_state::enqueue_fep(factor_vm *parent) volatile
14 fatal_error("Low-level debugger interrupted", 0);
15 atomic::store(&fep_p, true);
16 enqueue_safepoint(parent);
19 void safepoint_state::enqueue_samples(factor_vm *parent, cell samples, cell pc, bool foreign_thread_p) volatile
21 if (atomic::load(&parent->sampling_profiler_p))
23 atomic::fetch_add(&sample_counts.sample_count, samples);
25 atomic::fetch_add(&sample_counts.foreign_thread_sample_count, samples);
27 if (atomic::load(&parent->current_gc_p))
28 atomic::fetch_add(&sample_counts.gc_sample_count, samples);
29 if (atomic::load(&parent->current_jit_count) > 0)
30 atomic::fetch_add(&sample_counts.jit_sample_count, samples);
31 if (!parent->code->seg->in_segment_p(pc))
32 atomic::fetch_add(&sample_counts.foreign_sample_count, samples);
34 enqueue_safepoint(parent);
38 void safepoint_state::handle_safepoint(factor_vm *parent, cell pc) volatile
40 parent->code->unguard_safepoint();
41 parent->faulting_p = false;
43 if (atomic::load(&fep_p))
45 if (atomic::load(&parent->sampling_profiler_p))
46 parent->end_sampling_profiler();
47 std::cout << "Interrupted\n";
49 atomic::store(&fep_p, false);
51 else if (atomic::load(&parent->sampling_profiler_p))
53 FACTOR_ASSERT(parent->code->seg->in_segment_p(pc));
54 code_block *block = parent->code->code_block_for_address(pc);
55 bool prolog_p = (cell)block->entry_point() == pc;
57 parent->record_sample(prolog_p);