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);
}
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)
{
factor_vm *vm = current_vm_p();
if (vm)
vm->safepoint.enqueue_signal(signal);
enqueue_signal(vm, signal);
else
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();
if (vm)
vm->safepoint.enqueue_fep(signal);
{
vm->safepoint.enqueue_fep();
enqueue_signal(vm, signal);
}
else
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)
{
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()
@ -443,14 +454,4 @@ void open_console()
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 safepoint_state::report_signal(int fd) volatile {}
THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
{
@ -289,7 +288,7 @@ static BOOL WINAPI ctrl_handler(DWORD dwCtrlType)
threads. */
assert(thread_vms.size() == 1);
factor_vm *vm = thread_vms.begin()->second;
vm->safepoint.enqueue_fep(0);
vm->safepoint.enqueue_fep();
return TRUE;
}
default:

View File

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

View File

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