vm: add atomic::load and atomic::store functions
Abstract out the fence-and-load and store-and-fence patternsdb4
parent
81aac9359f
commit
4d39e59054
|
@ -1,3 +1,5 @@
|
||||||
|
#define FACTOR_FORCE_INLINE __forceinline
|
||||||
|
|
||||||
namespace factor {
|
namespace factor {
|
||||||
namespace atomic {
|
namespace atomic {
|
||||||
__forceinline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
|
__forceinline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
|
||||||
|
@ -44,3 +46,4 @@ namespace factor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "atomic.hpp"
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#define FACTOR_FORCE_INLINE __forceinline
|
||||||
|
|
||||||
namespace factor {
|
namespace factor {
|
||||||
namespace atomic {
|
namespace atomic {
|
||||||
__forceinline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
|
__forceinline static bool cas(volatile cell *ptr, cell old_val, cell new_val)
|
||||||
|
@ -44,3 +46,4 @@ namespace factor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "atomic.hpp"
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#define FACTOR_FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
namespace factor {
|
namespace factor {
|
||||||
namespace atomic {
|
namespace atomic {
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
|
@ -40,3 +41,5 @@ namespace factor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "atomic.hpp"
|
||||||
|
|
|
@ -172,20 +172,20 @@ void factor_vm::enqueue_safepoint_fep()
|
||||||
{
|
{
|
||||||
if (fep_p)
|
if (fep_p)
|
||||||
fatal_error("Low-level debugger interrupted", 0);
|
fatal_error("Low-level debugger interrupted", 0);
|
||||||
safepoint_fep = true;
|
atomic::store(&safepoint_fep_p, true);
|
||||||
code->guard_safepoint();
|
code->guard_safepoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
void factor_vm::handle_safepoint()
|
void factor_vm::handle_safepoint()
|
||||||
{
|
{
|
||||||
code->unguard_safepoint();
|
code->unguard_safepoint();
|
||||||
if (safepoint_fep)
|
if (atomic::load(&safepoint_fep_p))
|
||||||
{
|
{
|
||||||
if (sampling_profiler_p)
|
if (atomic::load(&sampling_profiler_p))
|
||||||
end_sampling_profiler();
|
end_sampling_profiler();
|
||||||
std::cout << "Interrupted\n";
|
std::cout << "Interrupted\n";
|
||||||
factorbug();
|
factorbug();
|
||||||
safepoint_fep = false;
|
atomic::store(&safepoint_fep_p, false);
|
||||||
}
|
}
|
||||||
else if (sampling_profiler_p)
|
else if (sampling_profiler_p)
|
||||||
record_sample();
|
record_sample();
|
||||||
|
|
|
@ -309,7 +309,7 @@ void factor_vm::sampler_thread_loop()
|
||||||
|
|
||||||
assert(QueryPerformanceCounter(&counter));
|
assert(QueryPerformanceCounter(&counter));
|
||||||
counter.QuadPart *= samples_per_second;
|
counter.QuadPart *= samples_per_second;
|
||||||
while (atomic::fence(), sampling_profiler_p)
|
while (atomic::load(&sampling_profiler_p))
|
||||||
{
|
{
|
||||||
SwitchToThread();
|
SwitchToThread();
|
||||||
assert(QueryPerformanceCounter(&new_counter));
|
assert(QueryPerformanceCounter(&new_counter));
|
||||||
|
@ -345,8 +345,7 @@ void factor_vm::start_sampling_profiler_timer()
|
||||||
|
|
||||||
void factor_vm::end_sampling_profiler_timer()
|
void factor_vm::end_sampling_profiler_timer()
|
||||||
{
|
{
|
||||||
sampling_profiler_p = false;
|
atomic::store(&sampling_profiler_p, false);
|
||||||
atomic::fence();
|
|
||||||
DWORD wait_result = WaitForSingleObject(sampler_thread,
|
DWORD wait_result = WaitForSingleObject(sampler_thread,
|
||||||
3000*(DWORD)samples_per_second);
|
3000*(DWORD)samples_per_second);
|
||||||
if (wait_result != WAIT_OBJECT_0)
|
if (wait_result != WAIT_OBJECT_0)
|
||||||
|
|
|
@ -93,8 +93,7 @@ void factor_vm::start_sampling_profiler(fixnum rate)
|
||||||
|
|
||||||
void factor_vm::end_sampling_profiler()
|
void factor_vm::end_sampling_profiler()
|
||||||
{
|
{
|
||||||
sampling_profiler_p = false;
|
atomic::store(&sampling_profiler_p, false);
|
||||||
atomic::fence();
|
|
||||||
end_sampling_profiler_timer();
|
end_sampling_profiler_timer();
|
||||||
record_sample();
|
record_sample();
|
||||||
}
|
}
|
||||||
|
@ -151,13 +150,13 @@ void factor_vm::primitive_clear_samples()
|
||||||
|
|
||||||
void factor_vm::enqueue_safepoint_sample(cell samples, cell pc, bool foreign_thread_p)
|
void factor_vm::enqueue_safepoint_sample(cell samples, cell pc, bool foreign_thread_p)
|
||||||
{
|
{
|
||||||
if (atomic::fence(), sampling_profiler_p)
|
if (atomic::load(&sampling_profiler_p))
|
||||||
{
|
{
|
||||||
atomic::add(&safepoint_sample_counts.sample_count, samples);
|
atomic::add(&safepoint_sample_counts.sample_count, samples);
|
||||||
if (foreign_thread_p)
|
if (foreign_thread_p)
|
||||||
atomic::add(&safepoint_sample_counts.foreign_thread_sample_count, samples);
|
atomic::add(&safepoint_sample_counts.foreign_thread_sample_count, samples);
|
||||||
else {
|
else {
|
||||||
if (atomic::fence(), current_gc)
|
if (atomic::load(¤t_gc_p))
|
||||||
atomic::add(&safepoint_sample_counts.gc_sample_count, samples);
|
atomic::add(&safepoint_sample_counts.gc_sample_count, samples);
|
||||||
if (pc != 0 && !code->seg->in_segment_p(pc))
|
if (pc != 0 && !code->seg->in_segment_p(pc))
|
||||||
atomic::add(&safepoint_sample_counts.foreign_sample_count, samples);
|
atomic::add(&safepoint_sample_counts.foreign_sample_count, samples);
|
||||||
|
|
|
@ -9,7 +9,7 @@ factor_vm::factor_vm() :
|
||||||
c_to_factor_func(NULL),
|
c_to_factor_func(NULL),
|
||||||
counting_profiler_p(false),
|
counting_profiler_p(false),
|
||||||
sampling_profiler_p(false),
|
sampling_profiler_p(false),
|
||||||
safepoint_fep(false),
|
safepoint_fep_p(false),
|
||||||
gc_off(false),
|
gc_off(false),
|
||||||
current_gc(NULL),
|
current_gc(NULL),
|
||||||
gc_events(NULL),
|
gc_events(NULL),
|
||||||
|
|
|
@ -62,7 +62,7 @@ struct factor_vm
|
||||||
|
|
||||||
/* Is profiling enabled? */
|
/* Is profiling enabled? */
|
||||||
bool counting_profiler_p;
|
bool counting_profiler_p;
|
||||||
volatile bool sampling_profiler_p;
|
volatile cell sampling_profiler_p;
|
||||||
fixnum samples_per_second;
|
fixnum samples_per_second;
|
||||||
|
|
||||||
/* Global variables used to pass fault handler state from signal handler
|
/* Global variables used to pass fault handler state from signal handler
|
||||||
|
@ -71,7 +71,7 @@ struct factor_vm
|
||||||
cell signal_number;
|
cell signal_number;
|
||||||
cell signal_fault_addr;
|
cell signal_fault_addr;
|
||||||
unsigned int signal_fpu_status;
|
unsigned int signal_fpu_status;
|
||||||
volatile bool safepoint_fep;
|
volatile cell safepoint_fep_p;
|
||||||
|
|
||||||
/* State kept by the sampling profiler */
|
/* State kept by the sampling profiler */
|
||||||
std::vector<profiling_sample> samples;
|
std::vector<profiling_sample> samples;
|
||||||
|
|
Loading…
Reference in New Issue