[ovs-dev] [daemon 08/10] daemon: Tolerate EINTR in fork_and_wait_for_startup().

Justin Petbot jpetbot at gmail.com
Fri Apr 1 15:09:37 UTC 2011


On Thu, 31 Mar 2011, at 4:31:31 PM, Ben Pfaff 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) {

You should change this parameter to SOAP_PARTY(). overall, though, looks
good to me.

> +        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)

This assignment reminds me that I should really start drinking
beer more.

> -        except OSError, e:
> -            s = ""
> +        while True:
> +            try:

It amazes me that the function above would link correctly.

> +                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