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

View File

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

View File

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

View File

@ -21,7 +21,7 @@ struct safepoint_state
void enqueue_safepoint() 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
void enqueue_signal(cell signal) volatile;