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/socket.c | |
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/socket.c')
-rw-r--r-- | src/socket.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c index 2b2bc52..0a0a3a9 100644 --- a/src/socket.c +++ b/src/socket.c @@ -559,9 +559,20 @@ enable_socket (int fd) FD_SET (fd, &fdset[PIES_EVT_EX]); } +static int (*pies_pause_hook) (void); + +void +pies_set_hook (int (*f) (void)) +{ + pies_pause_hook = f; +} + void pies_pause (void) { + if (pies_pause_hook && pies_pause_hook ()) + return; + if (fd_max == -1) calc_fd_max (); |