Game detection: foreign GPU holders take an external lock hold (GAME_PROCS, GPU_FOREIGN_VRAM_MB)
This commit is contained in:
@@ -226,3 +226,70 @@ func TestRace(t *testing.T) {
|
||||
t.Fatalf("leaked lock state: state=%s n=%d pending=%v", state, n, pending)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExternalHoldBlocksBoth(t *testing.T) {
|
||||
lk := New(nil)
|
||||
ctx := context.Background()
|
||||
|
||||
lk.SetExternal("game.exe (pid 42)")
|
||||
if lk.TryAcquireLLM() {
|
||||
t.Fatal("TryAcquireLLM succeeded during external hold")
|
||||
}
|
||||
if got := lk.External(); got != "game.exe (pid 42)" {
|
||||
t.Fatalf("External() = %q", got)
|
||||
}
|
||||
if state, _, _ := lk.Snapshot(); state != StateExternal {
|
||||
t.Fatalf("state=%s, want external", state)
|
||||
}
|
||||
|
||||
llmAcquired := make(chan struct{})
|
||||
go func() {
|
||||
if err := lk.AcquireLLM(ctx); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
close(llmAcquired)
|
||||
}()
|
||||
assertBlocked(t, llmAcquired, "LLM acquire during external hold")
|
||||
|
||||
imageAcquired := make(chan struct{})
|
||||
go func() {
|
||||
if err := lk.AcquireImage(ctx); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
close(imageAcquired)
|
||||
}()
|
||||
assertBlocked(t, imageAcquired, "image acquire during external hold")
|
||||
|
||||
lk.ClearExternal()
|
||||
// The queued image job wins over the LLM waiter (image priority).
|
||||
waitFor(t, imageAcquired, "image acquire after ClearExternal")
|
||||
assertBlocked(t, llmAcquired, "LLM acquire while image active")
|
||||
lk.ReleaseImage()
|
||||
waitFor(t, llmAcquired, "LLM acquire after image release")
|
||||
lk.ReleaseLLM()
|
||||
}
|
||||
|
||||
func TestExternalHoldDoesNotPreempt(t *testing.T) {
|
||||
lk := New(nil)
|
||||
ctx := context.Background()
|
||||
if err := lk.AcquireLLM(ctx); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
lk.SetExternal("game.exe")
|
||||
// In-flight LLM work keeps the llm state; the hold blocks new grants.
|
||||
if state, _, _ := lk.Snapshot(); state != StateLLM {
|
||||
t.Fatalf("state=%s, want llm while work in flight", state)
|
||||
}
|
||||
if lk.TryAcquireLLM() {
|
||||
t.Fatal("TryAcquireLLM succeeded during external hold")
|
||||
}
|
||||
lk.ReleaseLLM()
|
||||
if state, _, _ := lk.Snapshot(); state != StateExternal {
|
||||
t.Fatalf("state=%s, want external after drain", state)
|
||||
}
|
||||
lk.ClearExternal()
|
||||
if state, _, _ := lk.Snapshot(); state != StateIdle {
|
||||
t.Fatalf("state=%s, want idle", state)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user