vm: write signals to pipe immediately
The whole point is to wake up the mx without waiting for the next safepoint derpdb4
parent
0e3c315099
commit
04c6b2c393
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue