...and if true, this notion of “it’s atomic unless it’s not” deserves a
name: the “subatomic operation.”

On Sun, Mar 1, 2020 at 6:56 AM Ian Lance Taylor <i...@golang.org> wrote:

> On Sat, Feb 29, 2020 at 9:45 PM Philip Boampong <pboampo...@gmail.com>
> wrote:
> >
> > > And dup2 is not documented to return EINTR
> >
> > Yes, it is. In the same man page you quoted [1].
> > |  EINTR  The dup2() or dup3() call was interrupted by a signal; see
> > |         signal(7).
> >
> > > and the Linux kernel code shown above does not have any path that
> > > returns EINTR.
> >
> > That's a relief, but I would be more comfortable if the man page was
> accurate.
> >
> > > dup2 is documented to atomically close newfd and duplicate oldfd
> > > onto it.  That means that either newfd is untouched, or oldfd is
> > > duplicated onto it.
> >
> > If that is true, there is indeed no problem in retrying on EINTR, but
> > (as I explained two times already) someone disagrees with your
> > premise, notably the python standard library implementation [2].
> >
> > From PEP 475 [3]:
> > | os.close, close() methods and os.dup2() are a special case: they will
> > | ignore EINTR instead of retrying. The reason is complex but involves
> > | behaviour under Linux and the fact that the file descriptor may really
> > | be closed even if EINTR is returned.
> >
> > "the file descriptor may really be closed even if EINTR is returned",
> > hence the alleged race if dup2 is retried.
> >
> > libuv is of the same opinion [4].
> >
> > That's why I was asking for more evidence about the exact meaning of
> > "performed atomically". It could just mean that no one can "steal"
> > newfd between close and duplication, even though your stronger
> > interpretation makes sense and seems to reflect the actual kernel
> > code.
> >
> > Maybe the python folks are wrongly assuming that errors from the
> > implicit close are reported by dup2 (the man clearly says that they
> > are not).
> >
> > [1] http://man7.org/linux/man-pages/man2/dup2.2.html
> > [2]
> https://github.com/python/cpython/blob/6e02691f300c9918ac5806dafa1f2ecef451d733/Modules/posixmodule.c#L8730
> > [3] https://www.python.org/dev/peps/pep-0475/
> > [4] https://github.com/libuv/libuv/issues/462
>
>
> If dup2 can 1) close newfd; 2) receive a signal before duping oldfd to
> newfd; 3) return EINTR leaving newfd closed, then dup2 requires
> considerable care in any multi-threaded program.  It requires that if
> one thread is calling dup2, no other thread is permitted to open a
> file or socket or other file descriptor.  That seems both unfortunate
> and unbelievable.  I would like to see hard evidence before believing
> that kernel developers for any OS would create a system with such a
> bug.
>
> Ian
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUbftML8sERv1B9CMa0tKRi0y2Nf%2BRJgP%2B7zQhJ7ZsXzA%40mail.gmail.com
> .
>
-- 

*Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CALoEmQxK5%3DErxB8L1YPKdW4Ca5_D3Zq0T68vB1O1EsJsdPeE1Q%40mail.gmail.com.

Reply via email to