[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