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
parent
b46fd5e655
commit
18e01f7770
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue