]> git.lizzy.rs Git - rust.git/commit
Rollup merge of #50638 - tbu-:pr_open_cloexec_once, r=nagisa
authorkennytm <kennytm@gmail.com>
Wed, 16 May 2018 15:22:45 +0000 (23:22 +0800)
committerGitHub <noreply@github.com>
Wed, 16 May 2018 15:22:45 +0000 (23:22 +0800)
commitd623f45a4048b061e28a528a1db858bec60b9489
tree0e988cccbbbe0249bbf2d7e0af8c9854ed811712
parent2a3f5367a23a769a068c37460db336de427c4b48
parent6d1da8232997af4b785486329f01995440818920
Rollup merge of #50638 - tbu-:pr_open_cloexec_once, r=nagisa

Don't unconditionally set CLOEXEC twice on every fd we open on Linux

Previously, every `open64` was accompanied by a `ioctl(…, FIOCLEX)`,
because some old Linux version would ignore the `O_CLOEXEC` flag we pass
to the `open64` function.

Now, we check whether the `CLOEXEC` flag is set on the first file we
open – if it is, we won't do extra syscalls for every opened file. If it
is not set, we fall back to the old behavior of unconditionally calling
`ioctl(…, FIOCLEX)` on newly opened files.

On old Linuxes, this amounts to one extra syscall per process, namely
the `fcntl(…, F_GETFD)` call to check the `CLOEXEC` flag.

On new Linuxes, this reduces the number of syscalls per opened file by
one, except for the first file, where it does the same number of
syscalls as before (`fcntl(…, F_GETFD)` to check the flag instead of
`ioctl(…, FIOCLEX)` to set it).
src/libstd/sys/unix/fd.rs