diff --git a/os/utils.c b/os/utils.c index 9b6fb3081..b45719e26 100644 --- a/os/utils.c +++ b/os/utils.c @@ -1243,14 +1243,15 @@ SmartScheduleTimer(int sig) SmartScheduleTime += SmartScheduleInterval; } -void -SmartScheduleInit(void) +static int +SmartScheduleEnable(void) { + int ret = 0; #ifdef SMART_SCHEDULE_POSSIBLE struct sigaction act; if (SmartScheduleDisable) - return; + return 0; memset((char *) &act, 0, sizeof(struct sigaction)); @@ -1259,11 +1260,40 @@ SmartScheduleInit(void) act.sa_handler = SmartScheduleTimer; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGALRM); - if (sigaction(SIGALRM, &act, 0) < 0) { + ret = sigaction(SIGALRM, &act, 0); +#endif + return ret; +} + +static int +SmartSchedulePause(void) +{ + int ret = 0; +#ifdef SMART_SCHEDULE_POSSIBLE + struct sigaction act; + + if (SmartScheduleDisable) + return 0; + + memset((char *) &act, 0, sizeof(struct sigaction)); + + act.sa_handler = SIG_IGN; + sigemptyset(&act.sa_mask); + ret = sigaction(SIGALRM, &act, 0); +#endif + return ret; +} + +void +SmartScheduleInit(void) +{ + if (SmartScheduleDisable) + return; + + if (SmartScheduleEnable() < 0) { perror("sigaction for smart scheduler"); SmartScheduleDisable = TRUE; } -#endif } #ifdef SIG_BLOCK @@ -1438,8 +1468,6 @@ static struct pid { int pid; } *pidlist; -OsSigHandlerPtr old_alarm = NULL; /* XXX horrible awful hack */ - void * Popen(const char *command, const char *type) { @@ -1462,8 +1490,7 @@ Popen(const char *command, const char *type) } /* Ignore the smart scheduler while this is going on */ - old_alarm = OsSignal(SIGALRM, SIG_IGN); - if (old_alarm == SIG_ERR) { + if (SmartSchedulePause() < 0) { close(pdes[0]); close(pdes[1]); free(cur); @@ -1476,7 +1503,7 @@ Popen(const char *command, const char *type) close(pdes[0]); close(pdes[1]); free(cur); - if (OsSignal(SIGALRM, old_alarm) == SIG_ERR) + if (SmartScheduleEnable() < 0) perror("signal"); return NULL; case 0: /* child */ @@ -1651,7 +1678,7 @@ Pclose(void *iop) /* allow EINTR again */ OsReleaseSignals(); - if (old_alarm && OsSignal(SIGALRM, old_alarm) == SIG_ERR) { + if (SmartScheduleEnable() < 0) { perror("signal"); return -1; }