[project @ 1999-06-25 09:16:46 by simonmar]
authorsimonmar <unknown>
Fri, 25 Jun 1999 09:16:46 +0000 (09:16 +0000)
committersimonmar <unknown>
Fri, 25 Jun 1999 09:16:46 +0000 (09:16 +0000)
Set context_switch to 1 after scheduling a signal handler.  This will
ensure the running thread is interrupted as soon as possible.

ghc/rts/Signals.c

index 219ce67..0953c3c 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
 /* -----------------------------------------------------------------------------
- * $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
  *
@@ -9,6 +9,7 @@
 
 #include "Rts.h"
 #include "SchedAPI.h"
 
 #include "Rts.h"
 #include "SchedAPI.h"
+#include "Schedule.h"
 #include "Signals.h"
 #include "RtsUtils.h"
 #include "RtsFlags.h"
 #include "Signals.h"
 #include "RtsUtils.h"
 #include "RtsFlags.h"
@@ -73,7 +74,7 @@ generic_handler(int sig)
        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
@@ -108,6 +109,8 @@ generic_handler(int sig)
     sigemptyset(&signals);
     sigaddset(&signals, sig);
     sigprocmask(SIG_UNBLOCK, &signals, NULL);
     sigemptyset(&signals);
     sigaddset(&signals, sig);
     sigprocmask(SIG_UNBLOCK, &signals, NULL);
+
+    context_switch = 1;
 }
 
 /* -----------------------------------------------------------------------------
 }
 
 /* -----------------------------------------------------------------------------
@@ -169,11 +172,13 @@ sig_install(StgInt sig, StgInt spi, StgStablePtr handler, sigset_t *mask)
        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");
     }