]> Cypherpunks repositories - gostls13.git/commitdiff
internal/poll: use ignoringEINTR in Darwin Fsync
authorIan Lance Taylor <iant@golang.org>
Thu, 1 Oct 2020 00:37:24 +0000 (17:37 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 1 Oct 2020 02:42:58 +0000 (02:42 +0000)
Also add comment explaining why we don't use ignoringEINTR around
call to close.

Fixes #41115

Change-Id: Ia7bbe01eaf26003f70d184b7e82803efef2b2c18
Reviewed-on: https://go-review.googlesource.com/c/go/+/258542
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/internal/poll/fd_fsync_darwin.go
src/internal/poll/fd_unix.go

index 91751496a413e866626d257a19d399d99ce0deeb..48e7596922ba5b54a89375b92ca914911107199a 100644 (file)
@@ -14,7 +14,8 @@ func (fd *FD) Fsync() error {
                return err
        }
        defer fd.decref()
-
-       _, e1 := fcntl(fd.Sysfd, syscall.F_FULLFSYNC, 0)
-       return e1
+       return ignoringEINTR(func() error {
+               _, err := fcntl(fd.Sysfd, syscall.F_FULLFSYNC, 0)
+               return err
+       })
 }
index f6f6c52f31883edb52f6397b7b84a23e2f84c2a7..2e77e76c87135e19360818bbd26170bdea32b840 100644 (file)
@@ -74,7 +74,14 @@ func (fd *FD) destroy() error {
        // Poller may want to unregister fd in readiness notification mechanism,
        // so this must be executed before CloseFunc.
        fd.pd.close()
+
+       // We don't use ignoringEINTR here because POSIX does not define
+       // whether the descriptor is closed if close returns EINTR.
+       // If the descriptor is indeed closed, using a loop would race
+       // with some other goroutine opening a new descriptor.
+       // (The Linux kernel guarantees that it is closed on an EINTR error.)
        err := CloseFunc(fd.Sysfd)
+
        fd.Sysfd = -1
        runtime_Semrelease(&fd.csema)
        return err