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