]> gitweb.factorcode.org Git - factor.git/blob - vm/safepoints.cpp
vm: enqueue signals for FEP signals too
[factor.git] / vm / safepoints.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 void safepoint_state::enqueue_safepoint() volatile
7 {
8         parent->code->guard_safepoint();
9 }
10
11 void safepoint_state::enqueue_fep(cell signal) volatile
12 {
13         if (parent->fep_p)
14                 fatal_error("Low-level debugger interrupted", 0);
15         atomic::store(&fep_p, true);
16         if (signal != 0)
17                 atomic::store(&queued_signal, signal);
18         enqueue_safepoint();
19 }
20
21 void safepoint_state::enqueue_signal(cell signal) volatile
22 {
23         atomic::store(&queued_signal, signal);
24         enqueue_safepoint();
25 }
26
27 void safepoint_state::enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile
28 {
29         if (atomic::load(&parent->sampling_profiler_p))
30         {
31                 atomic::add(&sample_counts.sample_count, samples);
32                 if (foreign_thread_p)
33                         atomic::add(&sample_counts.foreign_thread_sample_count, samples);
34                 else {
35                         if (atomic::load(&parent->current_gc_p))
36                                 atomic::fetch_add(&sample_counts.gc_sample_count, samples);
37                         if (atomic::load(&parent->current_jit_count) > 0)
38                                 atomic::fetch_add(&sample_counts.jit_sample_count, samples);
39                         if (!parent->code->seg->in_segment_p(pc))
40                                 atomic::fetch_add(&sample_counts.foreign_sample_count, samples);
41                 }
42                 enqueue_safepoint();
43         }
44 }
45
46 void safepoint_state::handle_safepoint() volatile
47 {
48         parent->code->unguard_safepoint();
49
50         report_signal(parent->signal_pipe_input);
51
52         if (atomic::load(&fep_p))
53         {
54                 if (atomic::load(&parent->sampling_profiler_p))
55                         parent->end_sampling_profiler();
56                 std::cout << "Interrupted\n";
57                 parent->factorbug();
58                 atomic::store(&fep_p, false);
59         }
60         else if (atomic::load(&parent->sampling_profiler_p))
61                 parent->record_sample();
62 }
63
64 }