summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Drake <drake@endlessm.com>2015-05-20 13:16:12 -0600
committerAdam Jackson <ajax@redhat.com>2015-09-21 11:06:39 -0400
commit1f915e8b524dd02011158aa038935970684c7630 (patch)
tree769e86202ae2b6949990b3b893a8e452715fded1
parent94ab7455abc213fc96760e29ab2e943ec682fb22 (diff)
Keep SIGALRM restart flag after Popen
Commit 94ab7455 added SA_RESTART to the SIGALRM handler. However, the Popen code tears down and recreates the SIGALRM handler via OsSignal(), and this flag is dropped at this time. Clean the code to use just a single codepath for creating this signal handler, always applying SA_RESTART. [ajax: Fixed commit id] Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Daniel Drake <drake@endlessm.com>
-rw-r--r--os/utils.c49
1 files changed, 38 insertions, 11 deletions
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;
}