aboutsummaryrefslogtreecommitdiff
path: root/src/sysvinit.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-02-19 08:41:12 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-02-19 08:41:12 +0200
commite6902abfddb4d7b16dc9a4231a3781f354a08cd5 (patch)
treec634621af2ae765460e010ce83c8492ed4e859bc /src/sysvinit.c
parent51a797445a4bfc34ad1ae7ea91e12486d823abda (diff)
downloadpies-e6902abfddb4d7b16dc9a4231a3781f354a08cd5.tar.gz
pies-e6902abfddb4d7b16dc9a4231a3781f354a08cd5.tar.bz2
Revamp program termination after reconfiguring.
* src/pies.h (PIES_CHLD_GC): New op. (progman_stop_tag): Remove proto. * src/pies.c (main): Handle PIES_CHLD_GC: stop all programs marked for termination. * src/comp.c (component_config_commit): Mark leftover components for termination, instead of waiting for them to terminate. * src/sysvinit.c (runlevel_setup_prog): Skip prog if its active status didn't change. Mark inactivated progs for termination. (sysvinit_runlevel_setup): Schedule PIES_CHLD_GC. (inittrans): Don't wait for programs to terminate. That will be done in the main loop. * src/prog.h (prog)<stop>: New boolean member. * src/progman.c (progman_cleanup) (progman_stop_component): Clear the stop flag. (progman_gc): New function. (progman_stop_tag): Remove.
Diffstat (limited to 'src/sysvinit.c')
-rw-r--r--src/sysvinit.c42
1 files changed, 5 insertions, 37 deletions
diff --git a/src/sysvinit.c b/src/sysvinit.c
index 6276228..41d5b9d 100644
--- a/src/sysvinit.c
+++ b/src/sysvinit.c
@@ -62,7 +62,6 @@ int initdefault; /* Default runlevel */
int dfl_level;
int emergency_shell;
-#define DIAG_CON (DIAG_TO_STDERR|DIAG_REOPEN_LOG)
int
console_open (int mode)
@@ -282,11 +281,14 @@ runlevel_setup_prog (struct prog *prog, void *data)
&& is_sysvinit (prog->v.p.comp))
{
int rc = enablecomp (prog, data);
- if (rc < 0)
+ if (rc < 0 || prog->v.p.active == rc)
return 0;
prog->v.p.active = rc;
if (rc)
prog->v.p.wait = is_comp_wait (prog->v.p.comp);
+ else if (prog->v.p.status != status_stopped
+ && prog->v.p.status != status_finished)
+ prog->v.p.stop = 1;
debug (2, ("%s: %s%s", prog_tag (prog),
prog->v.p.active ?
"enabled" : "disabled",
@@ -301,6 +303,7 @@ sysvinit_runlevel_setup (int mask)
struct enstate s;
s.mask = mask;
progman_foreach (runlevel_setup_prog, &s);
+ pies_schedule_children (PIES_CHLD_GC);
}
static int
@@ -763,26 +766,6 @@ sysvinit_begin ()
&& prog->v.p.status == status_running \
&& !prog->v.p.active)
-static int
-cond_running_disabled (struct prog *prog, void *data)
-{
- return IS_RUNNING_DISABLED_PROG (prog);
-}
-
-static int
-no_disabled_running (void *data)
-{
- return !progman_foreach (cond_running_disabled, NULL);
-}
-
-static int
-terminate_disabled (struct prog *prog, void *data)
-{
- if (IS_RUNNING_DISABLED_PROG (prog))
- prog_stop (prog, *(int*)data);
- return 0;
-}
-
int
inittrans ()
{
@@ -844,23 +827,8 @@ inittrans ()
if (trans)
{
- int sig;
-
envsetup ();
sysvinit_runlevel_setup (PIES_COMP_DEFAULT);
-
- /* Stop disabled programs */
- sig = SIGTERM;
- diagmsg (DIAG_CON, LOG_INFO, "Sending processes the TERM signal");
- progman_foreach (terminate_disabled, &sig);
- if (progman_wait_until (no_disabled_running, NULL))
- {
- sig = SIGKILL;
- diagmsg (DIAG_CON, LOG_INFO, "Sending processes the KILL signal");
- progman_foreach (terminate_disabled, &sig);
- progman_wait_until (no_disabled_running, NULL);
- }
-
pies_schedule_children (PIES_CHLD_WAKEUP);
}
return trans;

Return to:

Send suggestions and report system problems to the System administrator.