feat: replay deferred sigalrms

master
Sean McBride 3 years ago
parent 64e35f767e
commit cf5e6ea72d

@ -42,9 +42,11 @@ sandbox_set_as_running_user(struct sandbox *sandbox, sandbox_state_t last_state)
runtime_sandbox_total_increment(SANDBOX_RUNNING_USER);
runtime_sandbox_total_decrement(last_state);
/* WARNING: This state change needs to be at the end of this transition because all code below this assignment
* is preemptable */
/* WARNING: All code below this assignment is preemptable */
sandbox->state = SANDBOX_RUNNING_USER;
/* Now that we are preemptable, we can replay deferred sigalrms */
if (software_interrupt_deferred_sigalrm > 0) raise(SIGALRM);
}
static inline void

@ -250,11 +250,12 @@ software_interrupt_initialize(void)
{
struct sigaction signal_action;
memset(&signal_action, 0, sizeof(struct sigaction));
/* All supported signals trigger the same signal handler */
signal_action.sa_sigaction = software_interrupt_handle_signals;
signal_action.sa_flags = SA_SIGINFO | SA_RESTART;
/* all threads created by the calling thread will have signal blocked */
/* TODO: What does sa_mask do? I have to call software_interrupt_mask_signal below */
/* Mask SIGALRM and SIGUSR1 while the signal handler executes */
sigemptyset(&signal_action.sa_mask);
sigaddset(&signal_action.sa_mask, SIGALRM);
sigaddset(&signal_action.sa_mask, SIGUSR1);
@ -264,7 +265,11 @@ software_interrupt_initialize(void)
for (int i = 0; i < supported_signals_len; i++) {
int signal = supported_signals[i];
/* Mask this signal on the listener thread */
software_interrupt_mask_signal(signal);
/* But register the handler for this signal for the process */
if (sigaction(signal, &signal_action, NULL)) {
perror("sigaction");
exit(1);

Loading…
Cancel
Save