vm: write signals to pipe immediately

The whole point is to wake up the mx without waiting for the next safepoint derp
db4
Joe Groff 2011-11-07 18:53:07 -08:00
parent 0e3c315099
commit 04c6b2c393
4 changed files with 19 additions and 36 deletions

View File

@ -180,11 +180,19 @@ void synchronous_signal_handler(int signal, siginfo_t *siginfo, void *uap)
fatal_error("Foreign thread received signal", signal); fatal_error("Foreign thread received signal", signal);
} }
void safe_write(int fd, void *data, ssize_t size);
static void enqueue_signal(factor_vm *vm, int signal)
{
if (vm->signal_pipe_output != 0)
safe_write(vm->signal_pipe_output, &signal, sizeof(int));
}
void enqueue_signal_handler(int signal, siginfo_t *siginfo, void *uap) void enqueue_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{ {
factor_vm *vm = current_vm_p(); factor_vm *vm = current_vm_p();
if (vm) if (vm)
vm->safepoint.enqueue_signal(signal); enqueue_signal(vm, signal);
else else
fatal_error("Foreign thread received signal", signal); fatal_error("Foreign thread received signal", signal);
} }
@ -193,7 +201,10 @@ void fep_signal_handler(int signal, siginfo_t *siginfo, void *uap)
{ {
factor_vm *vm = current_vm_p(); factor_vm *vm = current_vm_p();
if (vm) if (vm)
vm->safepoint.enqueue_fep(signal); {
vm->safepoint.enqueue_fep();
enqueue_signal(vm, signal);
}
else else
fatal_error("Foreign thread received signal", signal); fatal_error("Foreign thread received signal", signal);
} }
@ -268,7 +279,7 @@ static void safe_pipe(int *in, int *out)
static void init_signal_pipe(factor_vm *vm) static void init_signal_pipe(factor_vm *vm)
{ {
safe_pipe(&vm->signal_pipe_input, &vm->signal_pipe_output); safe_pipe(&vm->signal_pipe_input, &vm->signal_pipe_output);
vm->special_objects[OBJ_SIGNAL_PIPE] = tag_fixnum(vm->signal_pipe_output); vm->special_objects[OBJ_SIGNAL_PIPE] = tag_fixnum(vm->signal_pipe_input);
} }
void factor_vm::unix_init_signals() void factor_vm::unix_init_signals()
@ -443,14 +454,4 @@ void open_console()
start_thread(stdin_loop,NULL); start_thread(stdin_loop,NULL);
} }
void safepoint_state::report_signal(int fd) volatile
{
int signal = (int)atomic::load(&queued_signal);
if (signal != 0)
{
safe_write(fd, &signal, sizeof(int));
atomic::store(&queued_signal, 0);
}
}
} }

View File

@ -169,7 +169,6 @@ void factor_vm::move_file(const vm_char *path1, const vm_char *path2)
} }
void factor_vm::init_signals() {} void factor_vm::init_signals() {}
void safepoint_state::report_signal(int fd) volatile {}
THREADHANDLE start_thread(void *(*start_routine)(void *), void *args) THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
{ {
@ -289,7 +288,7 @@ static BOOL WINAPI ctrl_handler(DWORD dwCtrlType)
threads. */ threads. */
assert(thread_vms.size() == 1); assert(thread_vms.size() == 1);
factor_vm *vm = thread_vms.begin()->second; factor_vm *vm = thread_vms.begin()->second;
vm->safepoint.enqueue_fep(0); vm->safepoint.enqueue_fep();
return TRUE; return TRUE;
} }
default: default:

View File

@ -8,19 +8,11 @@ void safepoint_state::enqueue_safepoint() volatile
parent->code->guard_safepoint(); parent->code->guard_safepoint();
} }
void safepoint_state::enqueue_fep(cell signal) volatile void safepoint_state::enqueue_fep() volatile
{ {
if (parent->fep_p) if (parent->fep_p)
fatal_error("Low-level debugger interrupted", 0); fatal_error("Low-level debugger interrupted", 0);
atomic::store(&fep_p, true); atomic::store(&fep_p, true);
if (signal != 0)
atomic::store(&queued_signal, signal);
enqueue_safepoint();
}
void safepoint_state::enqueue_signal(cell signal) volatile
{
atomic::store(&queued_signal, signal);
enqueue_safepoint(); enqueue_safepoint();
} }
@ -28,9 +20,9 @@ void safepoint_state::enqueue_samples(cell samples, cell pc, bool foreign_thread
{ {
if (atomic::load(&parent->sampling_profiler_p)) if (atomic::load(&parent->sampling_profiler_p))
{ {
atomic::add(&sample_counts.sample_count, samples); atomic::fetch_add(&sample_counts.sample_count, samples);
if (foreign_thread_p) if (foreign_thread_p)
atomic::add(&sample_counts.foreign_thread_sample_count, samples); atomic::fetch_add(&sample_counts.foreign_thread_sample_count, samples);
else { else {
if (atomic::load(&parent->current_gc_p)) if (atomic::load(&parent->current_gc_p))
atomic::fetch_add(&sample_counts.gc_sample_count, samples); atomic::fetch_add(&sample_counts.gc_sample_count, samples);
@ -47,8 +39,6 @@ void safepoint_state::handle_safepoint() volatile
{ {
parent->code->unguard_safepoint(); parent->code->unguard_safepoint();
report_signal(parent->signal_pipe_input);
if (atomic::load(&fep_p)) if (atomic::load(&fep_p))
{ {
if (atomic::load(&parent->sampling_profiler_p)) if (atomic::load(&parent->sampling_profiler_p))

View File

@ -6,13 +6,11 @@ struct safepoint_state
factor_vm *parent; factor_vm *parent;
cell fep_p; cell fep_p;
cell queued_signal;
profiling_sample_count sample_counts; profiling_sample_count sample_counts;
safepoint_state(factor_vm *parent) : safepoint_state(factor_vm *parent) :
parent(parent), parent(parent),
fep_p(false), fep_p(false),
queued_signal(0),
sample_counts() sample_counts()
{ {
} }
@ -21,12 +19,7 @@ struct safepoint_state
void enqueue_safepoint() volatile; void enqueue_safepoint() volatile;
void enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile; void enqueue_samples(cell samples, cell pc, bool foreign_thread_p) volatile;
void enqueue_fep(cell signal) volatile; void enqueue_fep() volatile;
// os-*.cpp
void enqueue_signal(cell signal) volatile;
void report_signal(int fd) volatile;
}; };
} }