container/dispatcher: instrument each goroutine individually

Scheduler nondeterminism cannot be accounted for, so do this instead.

There should not be any performance penalty as these calls are optimised out for direct.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2025-08-23 11:06:19 +09:00
parent ea1e3ebae9
commit 1b3902df78
4 changed files with 91 additions and 59 deletions

View File

@@ -22,6 +22,11 @@ type osFile interface {
// syscallDispatcher provides methods that make state-dependent system calls as part of their behaviour.
type syscallDispatcher interface {
// new returns a new instance of syscallDispatcher for use in another goroutine.
// A syscallDispatcher must never be used in any goroutine other than the one owning it,
// just synchronising access is not enough, as this is for test instrumentation.
new() syscallDispatcher
// lockOSThread provides [runtime.LockOSThread].
lockOSThread()
@@ -140,6 +145,8 @@ type syscallDispatcher interface {
// direct implements syscallDispatcher on the current kernel.
type direct struct{}
func (k direct) new() syscallDispatcher { return k }
func (direct) lockOSThread() { runtime.LockOSThread() }
func (direct) setPtracer(pid uintptr) error { return SetPtracer(pid) }