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>
This commit is contained in:
Daniel Drake 2015-05-20 13:16:12 -06:00 committed by Adam Jackson
parent 94ab7455ab
commit 1f915e8b52
1 changed files with 38 additions and 11 deletions

View File

@ -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;
}