5 void factor_vm::enqueue_fep() {
7 fatal_error("Low-level debugger interrupted", 0);
8 atomic::store(&safepoint_fep_p, true);
9 code->set_safepoint_guard(true);
12 void factor_vm::enqueue_samples(cell samples,
14 bool foreign_thread_p) {
16 if (!atomic::load(&sampling_profiler_p))
18 atomic::fetch_add(¤t_sample.sample_count, samples);
21 atomic::fetch_add(¤t_sample.foreign_thread_sample_count, samples);
23 if (atomic::load(¤t_gc_p))
24 atomic::fetch_add(¤t_sample.gc_sample_count, samples);
25 if (atomic::load(¤t_jit_count) > 0)
26 atomic::fetch_add(¤t_sample.jit_sample_count, samples);
27 if (!code->seg->in_segment_p(pc))
28 atomic::fetch_add(¤t_sample.foreign_sample_count, samples);
30 code->set_safepoint_guard(true);
33 // Allocates memory (record_sample)
34 void factor_vm::handle_safepoint(cell pc) {
35 code->set_safepoint_guard(false);
38 if (atomic::load(&safepoint_fep_p)) {
39 if (atomic::load(&sampling_profiler_p))
40 end_sampling_profiler();
41 std::cout << "Interrupted\n";
42 if (stop_on_ctrl_break) {
43 /* Ctrl-Break throws an exception, interrupting the main thread, same
44 as the "t" command in the factorbug debugger. But for Ctrl-Break to
45 work we don't require the debugger to be activated, or even enabled. */
46 atomic::store(&safepoint_fep_p, false);
47 general_error(ERROR_INTERRUPT, false_object, false_object);
51 atomic::store(&safepoint_fep_p, false);
52 } else if (atomic::load(&sampling_profiler_p)) {
53 FACTOR_ASSERT(code->seg->in_segment_p(pc));
54 code_block* block = code->code_block_for_address(pc);
55 bool prolog_p = block->entry_point() == pc;
57 record_sample(prolog_p);