vm: enqueue signals for FEP signals too

Although SIGINT still can't interrupt the current Factor thread in a sane way, this will at least wake up the run loop when waiting for input and fix #348 when implemented at the application level.
db4
Joe Groff 2011-11-07 14:05:31 -08:00
parent b46fd5e655
commit 18e01f7770
4 changed files with 6 additions and 4 deletions

View File

@ -193,7 +193,7 @@ 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(); vm->safepoint.enqueue_fep(signal);
else else
fatal_error("Foreign thread received signal", signal); fatal_error("Foreign thread received signal", signal);
} }

View File

@ -289,7 +289,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(); vm->safepoint.enqueue_fep(0);
return TRUE; return TRUE;
} }
default: default:

View File

@ -8,11 +8,13 @@ void safepoint_state::enqueue_safepoint() volatile
parent->code->guard_safepoint(); parent->code->guard_safepoint();
} }
void safepoint_state::enqueue_fep() volatile void safepoint_state::enqueue_fep(cell signal) 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(); enqueue_safepoint();
} }

View File

@ -21,7 +21,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() volatile; void enqueue_fep(cell signal) volatile;
// os-*.cpp // os-*.cpp
void enqueue_signal(cell signal) volatile; void enqueue_signal(cell signal) volatile;