diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-02-19 08:41:12 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-02-19 08:41:12 +0200 |
commit | e6902abfddb4d7b16dc9a4231a3781f354a08cd5 (patch) | |
tree | c634621af2ae765460e010ce83c8492ed4e859bc /src/sysvinit.c | |
parent | 51a797445a4bfc34ad1ae7ea91e12486d823abda (diff) | |
download | pies-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.c | 42 |
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; |