aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-22 22:24:14 +0900
committerOphestra <cat@gensokyo.uk>2025-08-22 22:24:14 +0900
commit1c692bfb7926c0f28cf7f38ca7b49f4941fd2b90 (patch)
tree7c96da4c637fa31115131e35510229f6a5b0f843
parent141a18999f36d3e6211d99b24a355d8ea908f32a (diff)
container/init: call lockOSThread through dispatcher
This degrades test performance if not stubbed out. Signed-off-by: Ophestra <cat@gensokyo.uk>
-rw-r--r--container/dispatcher.go6
-rw-r--r--container/dispatcher_test.go2
-rw-r--r--container/init.go7
3 files changed, 11 insertions, 4 deletions
diff --git a/container/dispatcher.go b/container/dispatcher.go
index 2482f0b3..86837b9d 100644
--- a/container/dispatcher.go
+++ b/container/dispatcher.go
@@ -8,6 +8,7 @@ import (
"os/exec"
"os/signal"
"path/filepath"
+ "runtime"
"syscall"
"hakurei.app/container/seccomp"
@@ -21,6 +22,9 @@ type osFile interface {
// syscallDispatcher provides methods that make state-dependent system calls as part of their behaviour.
type syscallDispatcher interface {
+ // lockOSThread provides [runtime.LockOSThread].
+ lockOSThread()
+
// setPtracer provides [SetPtracer].
setPtracer(pid uintptr) error
// setDumpable provides [SetDumpable].
@@ -136,6 +140,8 @@ type syscallDispatcher interface {
// direct implements syscallDispatcher on the current kernel.
type direct struct{}
+func (direct) lockOSThread() { runtime.LockOSThread() }
+
func (direct) setPtracer(pid uintptr) error { return SetPtracer(pid) }
func (direct) setDumpable(dumpable uintptr) error { return SetDumpable(dumpable) }
func (direct) setNoNewPrivs() error { return SetNoNewPrivs() }
diff --git a/container/dispatcher_test.go b/container/dispatcher_test.go
index f01b6f39..1152e167 100644
--- a/container/dispatcher_test.go
+++ b/container/dispatcher_test.go
@@ -315,6 +315,8 @@ func checkArgReflect(k *kstub, arg string, got any, n int) bool {
return true
}
+func (k *kstub) lockOSThread() { k.expect("lockOSThread") }
+
func (k *kstub) setPtracer(pid uintptr) error {
return k.expect("setPtracer").error(
checkArg(k, "pid", pid, 0))
diff --git a/container/init.go b/container/init.go
index 6688a348..2139ccc3 100644
--- a/container/init.go
+++ b/container/init.go
@@ -6,7 +6,6 @@ import (
"os"
"os/exec"
"path"
- "runtime"
"slices"
"strconv"
. "syscall"
@@ -81,11 +80,11 @@ type initParams struct {
}
func Init(prepareLogger func(prefix string), setVerbose func(verbose bool)) {
- initEntrypoint(prepareLogger, setVerbose, direct{})
+ initEntrypoint(direct{}, prepareLogger, setVerbose)
}
-func initEntrypoint(prepareLogger func(prefix string), setVerbose func(verbose bool), k syscallDispatcher) {
- runtime.LockOSThread()
+func initEntrypoint(k syscallDispatcher, prepareLogger func(prefix string), setVerbose func(verbose bool)) {
+ k.lockOSThread()
prepareLogger("init")
if k.getpid() != 1 {