]> gitweb.factorcode.org Git - factor.git/blob - vm/safepoints.cpp
help.html: making search box have first tab index
[factor.git] / vm / safepoints.cpp
1 #include "master.hpp"
2
3 namespace factor {
4
5 void factor_vm::enqueue_fep() {
6   if (fep_p)
7     fatal_error("Low-level debugger interrupted", 0);
8   atomic::store(&safepoint_fep_p, true);
9   code->set_safepoint_guard(true);
10 }
11
12 void factor_vm::enqueue_samples(cell samples,
13                                 cell pc,
14                                 bool foreign_thread_p) {
15
16   if (!atomic::load(&sampling_profiler_p))
17     return;
18   atomic::fetch_add(&current_sample.sample_count, samples);
19
20   if (foreign_thread_p)
21     atomic::fetch_add(&current_sample.foreign_thread_sample_count, samples);
22   else {
23     if (atomic::load(&current_gc_p))
24       atomic::fetch_add(&current_sample.gc_sample_count, samples);
25     if (atomic::load(&current_jit_count) > 0)
26       atomic::fetch_add(&current_sample.jit_sample_count, samples);
27     if (!code->seg->in_segment_p(pc))
28       atomic::fetch_add(&current_sample.foreign_sample_count, samples);
29   }
30   code->set_safepoint_guard(true);
31 }
32
33 // Allocates memory (record_sample)
34 void factor_vm::handle_safepoint(cell pc) {
35   code->set_safepoint_guard(false);
36   faulting_p = false;
37
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);
48       FACTOR_ASSERT(false);
49     }
50     factorbug();
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;
56
57     record_sample(prolog_p);
58   }
59 }
60
61 }