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.
{
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);
}
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:
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();
}
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;