ngroups, groups uintptr
)
- rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+ rlim := origRlimitNofile.Load()
// guard against side effects of shuffling fds below.
// Make sure that nextfd is beyond any currently open files so
}
// Restore original rlimit.
- if rlimOK && rlim.Cur != 0 {
- RawSyscall(SYS_SETRLIMIT, uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(&rlim)), 0)
+ if rlim != nil {
+ RawSyscall(SYS_SETRLIMIT, uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(rlim)), 0)
}
// Time to exec.
upid uintptr
)
- rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+ rlim := origRlimitNofile.Load()
// Record parent PID so child can test if it has died.
ppid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
}
// Restore original rlimit.
- if rlimOK && rlim.Cur != 0 {
- RawSyscall(SYS_SETRLIMIT, uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(&rlim)), 0)
+ if rlim != nil {
+ RawSyscall(SYS_SETRLIMIT, uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(rlim)), 0)
}
// Time to exec.
ngroups, groups uintptr
)
- rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+ rlim := origRlimitNofile.Load()
// guard against side effects of shuffling fds below.
// Make sure that nextfd is beyond any currently open files so
}
// Restore original rlimit.
- if rlimOK && rlim.Cur != 0 {
- setrlimit1(RLIMIT_NOFILE, unsafe.Pointer(&rlim))
+ if rlim != nil {
+ setrlimit1(RLIMIT_NOFILE, unsafe.Pointer(rlim))
}
// Time to exec.
ngroups, groups uintptr
)
- rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+ rlim := origRlimitNofile.Load()
// guard against side effects of shuffling fds below.
// Make sure that nextfd is beyond any currently open files so
}
// Restore original rlimit.
- if rlimOK && rlim.Cur != 0 {
- rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(&rlim)), 0)
+ if rlim != nil {
+ rawSyscall(abi.FuncPCABI0(libc_setrlimit_trampoline), uintptr(RLIMIT_NOFILE), uintptr(unsafe.Pointer(rlim)), 0)
}
// Time to exec.
c uintptr
)
- rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+ rlim := origRlimitNofile.Load()
if sys.UidMappings != nil {
puid = []byte("/proc/self/uid_map\000")
}
// Restore original rlimit.
- if rlimOK && rlim.Cur != 0 {
- rawSetrlimit(RLIMIT_NOFILE, &rlim)
+ if rlim != nil {
+ rawSetrlimit(RLIMIT_NOFILE, rlim)
}
// Enable tracing if requested.
}
runtime_BeforeExec()
- rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
- if rlimOK && rlim.Cur != 0 {
- Setrlimit(RLIMIT_NOFILE, &rlim)
+ rlim := origRlimitNofile.Load()
+ if rlim != nil {
+ Setrlimit(RLIMIT_NOFILE, rlim)
}
var err1 error
package syscall
func OrigRlimitNofile() Rlimit {
- if rlim, ok := origRlimitNofile.Load().(Rlimit); ok {
- return rlim
+ if rlim := origRlimitNofile.Load(); rlim != nil {
+ return *rlim
}
return Rlimit{0, 0}
}
"sync/atomic"
)
-// origRlimitNofile, if not {0, 0}, is the original soft RLIMIT_NOFILE.
-// When we can assume that we are bootstrapping with Go 1.19,
-// this can be atomic.Pointer[Rlimit].
-var origRlimitNofile atomic.Value // of Rlimit
+// origRlimitNofile, if non-nil, is the original soft RLIMIT_NOFILE.
+var origRlimitNofile atomic.Pointer[Rlimit]
// Some systems set an artificially low soft limit on open file count, for compatibility
// with code that uses select and its hard-coded maximum file descriptor
func init() {
var lim Rlimit
if err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {
- origRlimitNofile.Store(lim)
+ origRlimitNofile.Store(&lim)
lim.Cur = lim.Max
adjustFileLimit(&lim)
setrlimit(RLIMIT_NOFILE, &lim)
func Setrlimit(resource int, rlim *Rlimit) error {
err := setrlimit(resource, rlim)
if err == nil && resource == RLIMIT_NOFILE {
- // Store zeroes in origRlimitNofile to tell StartProcess
+ // Store nil in origRlimitNofile to tell StartProcess
// to not adjust the rlimit in the child process.
- origRlimitNofile.Store(Rlimit{0, 0})
+ origRlimitNofile.Store(nil)
}
return err
}
func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {
err = prlimit1(pid, resource, newlimit, old)
if err == nil && newlimit != nil && resource == RLIMIT_NOFILE {
- origRlimitNofile.Store(Rlimit{0, 0})
+ origRlimitNofile.Store(nil)
}
return err
}