[ovs-dev] [daemon 08/10] daemon: Tolerate EINTR in fork_and_wait_for_startup().
Ethan Jackson
ethan at nicira.com
Fri Apr 1 22:42:45 UTC 2011
Looks Good.
On Thu, Mar 31, 2011 at 4:31 PM, Ben Pfaff <blp at nicira.com> wrote:
> It seems possible that a signal coming in at the wrong time could confuse
> this code. It's always best to loop on EINTR.
> ---
> lib/daemon.c | 3 ++-
> python/ovs/daemon.py | 13 +++++++++----
> 2 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/lib/daemon.c b/lib/daemon.c
> index 64e2f9e..173dabe 100644
> --- a/lib/daemon.c
> +++ b/lib/daemon.c
> @@ -244,11 +244,12 @@ fork_and_wait_for_startup(int *fdp)
> pid = fork();
> if (pid > 0) {
> /* Running in parent process. */
> + size_t bytes_read;
> char c;
>
> close(fds[1]);
> fatal_signal_fork();
> - if (read(fds[0], &c, 1) != 1) {
> + if (read_fully(fds[0], &c, 1, &bytes_read) != 0) {
> int retval;
> int status;
>
> diff --git a/python/ovs/daemon.py b/python/ovs/daemon.py
> index 4e54e69..4df2371 100644
> --- a/python/ovs/daemon.py
> +++ b/python/ovs/daemon.py
> @@ -213,10 +213,15 @@ def _fork_and_wait_for_startup():
> # Running in parent process.
> os.close(wfd)
> ovs.fatal_signal.fork()
> - try:
> - s = os.read(rfd, 1)
> - except OSError, e:
> - s = ""
> + while True:
> + try:
> + s = os.read(rfd, 1)
> + error = 0
> + except OSError, e:
> + s = ""
> + error = e.errno
> + if error != errno.EINTR:
> + break
> if len(s) != 1:
> retval, status = _waitpid(pid, 0)
> if (retval == pid and
> --
> 1.7.1
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list