| //go:build !go1.23 |
| |
| // TODO: remove this file once go 1.22 is no longer supported. |
| |
| package system |
| |
| import ( |
| "sync/atomic" |
| "syscall" |
| _ "unsafe" // Needed for go:linkname to work. |
| ) |
| |
| //go:linkname syscallOrigRlimitNofile syscall.origRlimitNofile |
| var syscallOrigRlimitNofile atomic.Pointer[syscall.Rlimit] |
| |
| // ClearRlimitNofileCache clears go runtime's nofile rlimit cache. |
| // The argument is process RLIMIT_NOFILE values. |
| func ClearRlimitNofileCache(_ *syscall.Rlimit) { |
| // As reported in issue #4195, the new version of go runtime(since 1.19) |
| // will cache rlimit-nofile. Before executing execve, the rlimit-nofile |
| // of the process will be restored with the cache. In runc, this will |
| // cause the rlimit-nofile setting by the parent process for the container |
| // to become invalid. It can be solved by clearing this cache. But |
| // unfortunately, go stdlib doesn't provide such function, so we need to |
| // link to the private var `origRlimitNofile` in package syscall to hack. |
| syscallOrigRlimitNofile.Store(nil) |
| } |