Set context_switch to 1 after scheduling a signal handler. This will
ensure the running thread is interrupted as soon as possible.
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
- * $Id: Signals.c,v 1.5 1999/03/02 20:01:55 sof Exp $
+ * $Id: Signals.c,v 1.6 1999/06/25 09:16:46 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
*
* (c) The GHC Team, 1998-1999
*
#include "Rts.h"
#include "SchedAPI.h"
#include "Rts.h"
#include "SchedAPI.h"
#include "Signals.h"
#include "RtsUtils.h"
#include "RtsFlags.h"
#include "Signals.h"
#include "RtsUtils.h"
#include "RtsFlags.h"
either. However, we have to schedule a new thread somehow.
It's probably ok to request a context switch and allow the
either. However, we have to schedule a new thread somehow.
It's probably ok to request a context switch and allow the
- scheduler to start the handler thread, but how to we
+ scheduler to start the handler thread, but how do we
communicate this to the scheduler?
We need some kind of locking, but with low overhead (i.e. no
communicate this to the scheduler?
We need some kind of locking, but with low overhead (i.e. no
sigemptyset(&signals);
sigaddset(&signals, sig);
sigprocmask(SIG_UNBLOCK, &signals, NULL);
sigemptyset(&signals);
sigaddset(&signals, sig);
sigprocmask(SIG_UNBLOCK, &signals, NULL);
}
/* -----------------------------------------------------------------------------
}
/* -----------------------------------------------------------------------------
sigdelset(&userSignals, sig);
action.sa_handler = SIG_DFL;
break;
sigdelset(&userSignals, sig);
action.sa_handler = SIG_DFL;
break;
case STG_SIG_HAN:
handlers[sig] = (I_)handler;
sigaddset(&userSignals, sig);
action.sa_handler = generic_handler;
break;
case STG_SIG_HAN:
handlers[sig] = (I_)handler;
sigaddset(&userSignals, sig);
action.sa_handler = generic_handler;
break;
default:
barf("sig_install: bad spi");
}
default:
barf("sig_install: bad spi");
}