Commit d0e412e9 authored by Guido van Rossum's avatar Guido van Rossum

Speed up checking for signals and define intrcheck differently

parent 5369ab75
...@@ -30,6 +30,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ...@@ -30,6 +30,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "intrcheck.h" #include "intrcheck.h"
#include <signal.h> #include <signal.h>
#include <errno.h>
struct signalhandler_list { struct signalhandler_list {
int tripped; int tripped;
...@@ -37,6 +38,7 @@ struct signalhandler_list { ...@@ -37,6 +38,7 @@ struct signalhandler_list {
}; };
static struct signalhandler_list sig_list[NSIG]; static struct signalhandler_list sig_list[NSIG];
static int tripped = 0; /* Speed up sigcheck() when none tripped */
static object *default_sig_object; static object *default_sig_object;
static object *default_ignore_object; static object *default_ignore_object;
...@@ -55,6 +57,7 @@ static RETSIGTYPE ...@@ -55,6 +57,7 @@ static RETSIGTYPE
signal_handler(sig_num) signal_handler(sig_num)
int sig_num; int sig_num;
{ {
tripped++;
sig_list[sig_num].tripped = 1; sig_list[sig_num].tripped = 1;
(void *)signal(sig_num, &signal_handler); (void *)signal(sig_num, &signal_handler);
} }
...@@ -148,7 +151,7 @@ initsignal() ...@@ -148,7 +151,7 @@ initsignal()
sig_list[0].tripped = 0; sig_list[0].tripped = 0;
for (i = 1; i < NSIG; i++) { for (i = 1; i < NSIG; i++) {
void *t; /* type cop-out */ RETSIGTYPE (*t)();
t = signal(i, SIG_IGN); t = signal(i, SIG_IGN);
signal(i, t); signal(i, t);
sig_list[i].tripped = 0; sig_list[i].tripped = 0;
...@@ -313,7 +316,10 @@ int ...@@ -313,7 +316,10 @@ int
sigcheck() sigcheck()
{ {
int i; int i;
object *f = getframe(); object *f;
if (!tripped)
return 0;
f = getframe();
if (f == NULL) if (f == NULL)
f = None; f = None;
for (i = 1; i < NSIG; i++) { for (i = 1; i < NSIG; i++) {
...@@ -334,6 +340,7 @@ sigcheck() ...@@ -334,6 +340,7 @@ sigcheck()
} }
} }
} }
tripped = 0;
return 0; return 0;
} }
...@@ -348,8 +355,9 @@ initintr() ...@@ -348,8 +355,9 @@ initintr()
int int
intrcheck() intrcheck()
{ {
if (!sigcheck()) if (sig_list[SIGINT].tripped) {
return 0; sig_list[SIGINT].tripped = 0;
err_clear(); return 1;
return 1; }
return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment