]> gitweb.factorcode.org Git - factor.git/blob - vm/safepoints.cpp
VM: new function set_safepoint_guard to replace the functions (un)guard_safepoint
[factor.git] / vm / safepoints.cpp
1 #include "master.hpp"
2
3 namespace factor {
4
5 void safepoint_state::enqueue_safepoint(factor_vm* parent) volatile {
6   parent->code->set_safepoint_guard(true);
7 }
8
9 void safepoint_state::enqueue_fep(factor_vm* parent) volatile {
10   if (parent->fep_p)
11     fatal_error("Low-level debugger interrupted", 0);
12   atomic::store(&fep_p, true);
13   enqueue_safepoint(parent);
14 }
15
16 void safepoint_state::enqueue_samples(factor_vm* parent,
17                                       cell samples,
18                                       cell pc,
19                                       bool foreign_thread_p) volatile {
20
21   if (!atomic::load(&parent->sampling_profiler_p))
22     return;
23   atomic::fetch_add(&sample_counts.sample_count, samples);
24
25   if (foreign_thread_p)
26     atomic::fetch_add(&sample_counts.foreign_thread_sample_count, samples);
27   else {
28     if (atomic::load(&parent->current_gc_p))
29       atomic::fetch_add(&sample_counts.gc_sample_count, samples);
30     if (atomic::load(&parent->current_jit_count) > 0)
31       atomic::fetch_add(&sample_counts.jit_sample_count, samples);
32     if (!parent->code->seg->in_segment_p(pc))
33       atomic::fetch_add(&sample_counts.foreign_sample_count, samples);
34   }
35   enqueue_safepoint(parent);
36 }
37
38 void safepoint_state::handle_safepoint(factor_vm* parent, cell pc) volatile {
39   parent->code->set_safepoint_guard(false);
40   parent->faulting_p = false;
41
42   if (atomic::load(&fep_p)) {
43     if (atomic::load(&parent->sampling_profiler_p))
44       parent->end_sampling_profiler();
45     std::cout << "Interrupted\n";
46     parent->factorbug();
47     atomic::store(&fep_p, false);
48   } else if (atomic::load(&parent->sampling_profiler_p)) {
49     FACTOR_ASSERT(parent->code->seg->in_segment_p(pc));
50     code_block* block = parent->code->code_block_for_address(pc);
51     bool prolog_p = block->entry_point() == pc;
52
53     parent->record_sample(prolog_p);
54   }
55 }
56
57 }