diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-02-28 20:42:50 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-02-28 21:39:28 +0200 |
commit | 0d0a148121dcb8edd49cad900f27141336576f9d (patch) | |
tree | d458628bb80d5972f540826e1cf3fc8b8224265b /src/pies.h | |
parent | 14e0802da5587179607f3340d105914435ee117a (diff) | |
download | pies-0d0a148121dcb8edd49cad900f27141336576f9d.tar.gz pies-0d0a148121dcb8edd49cad900f27141336576f9d.tar.bz2 |
Synchronize changes in runlevel with configuration reloads
State transition algorithm used this far could cause spurious component
wakeups in some cases. Consider the following scenario: being in
runlevel N, the configuration is changed so that a component X is added
at runlevel N. Then a change to runlevel N+1 is initiated. What happens
then is that X is woken up (still being in runlevel N) and terminated
shortly afterwards, upon entering runlevel N+1.
To avoid this, configuration must be reloaded after runlevel changes.
* src/ctl.c (res_runlevel): Don't initiate ACTION_RELOAD after
setting the runlevel.
* src/pies.c (main): Begin main event loop with call
to pies_pause.
* src/pies.h (pies_set_hook): New proto.
(inittrans): Remove proto.
* src/socket.c (pies_set_hook): New function.
(pies_pause): Call pies_pause_hook if defined.
* src/sysvinit.c (inittrans): Change to static.
If transition was initiated by user (e.g. by invoking telinit),
schedule ACTION_RELOAD.
(sysvinit_begin): Set inittrans as pies_hook
Diffstat (limited to 'src/pies.h')
-rw-r--r-- | src/pies.h | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -417,6 +417,7 @@ struct component *component_depmap_next (pies_depmap_pos_t pos); | |||
417 | 417 | ||
418 | 418 | ||
419 | 419 | ||
420 | void pies_set_hook (int (*f) (void)); | ||
420 | void pies_pause (void); | 421 | void pies_pause (void); |
421 | 422 | ||
422 | enum | 423 | enum |
@@ -531,7 +532,6 @@ struct inetd_builtin *inetd_builtin_lookup (const char *service, int socktype); | |||
531 | 532 | ||
532 | /* sysvinit.c */ | 533 | /* sysvinit.c */ |
533 | void sysvinit_begin (void); | 534 | void sysvinit_begin (void); |
534 | int inittrans (void); | ||
535 | int is_comp_wait (struct component *comp); | 535 | int is_comp_wait (struct component *comp); |
536 | int is_valid_runlevel (int c); | 536 | int is_valid_runlevel (int c); |
537 | int console_open (int mode); | 537 | int console_open (int mode); |