diff options
| author | Tobias Klauser <tklauser@distanz.ch> | 2023-05-22 20:37:05 +0200 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-05-23 19:42:05 +0000 |
| commit | 3c3a883667390c2f03dffb3fdcb4fa4172cb23e6 (patch) | |
| tree | 7cae32ce54b521747afcb3f0b096f25c27d9bd61 /src/os/file_unix.go | |
| parent | c0b860ba313e57e6f57d98d12a0174a024473e0a (diff) | |
| download | go-3c3a883667390c2f03dffb3fdcb4fa4172cb23e6.tar.xz | |
os: avoid second fcntl syscall in NewFile on unix
CL 494915 introduced an additional fcntl(F_GETFL) syscall to determine
whether the file is in append-only mode. The existing unix.IsNonblock
call also issues an fcntl(F_GETFL) syscall. The two can be combined and
both the append-only mode and the non-blocking flags can be determined
from that syscall's result.
Change-Id: I915589ed94e079f6abaa2fd0032ef01f78698f7f
Reviewed-on: https://go-review.googlesource.com/c/go/+/497075
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Diffstat (limited to 'src/os/file_unix.go')
| -rw-r--r-- | src/os/file_unix.go | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 25ce83bf9d..a34de8333d 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -104,13 +104,15 @@ func (f *File) Fd() uintptr { // constraints apply. func NewFile(fd uintptr, name string) *File { kind := kindNewFile - if nb, err := unix.IsNonblock(int(fd)); err == nil && nb { - kind = kindNonBlock - } - f := newFile(fd, name, kind) + appendMode := false if flags, err := unix.Fcntl(int(fd), syscall.F_GETFL, 0); err == nil { - f.appendMode = flags&syscall.O_APPEND != 0 + if unix.HasNonblockFlag(flags) { + kind = kindNonBlock + } + appendMode = flags&syscall.O_APPEND != 0 } + f := newFile(fd, name, kind) + f.appendMode = appendMode return f } |
