From c07f37afe9526aa8fc9a154fb451c731fbae1244 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 19 Feb 2026 21:38:01 +0000 Subject: [PATCH] fix: guard nil exitErr wrapping, document concurrency invariant Co-Authored-By: Virgil --- model.go | 12 ++++++++++-- server.go | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/model.go b/model.go index 366bce3..b1dcf96 100644 --- a/model.go +++ b/model.go @@ -25,7 +25,11 @@ type rocmModel struct { func (m *rocmModel) Generate(ctx context.Context, prompt string, opts ...inference.GenerateOption) iter.Seq[inference.Token] { if !m.srv.alive() { m.mu.Lock() - m.lastErr = fmt.Errorf("rocm: server has exited: %w", m.srv.exitErr) + if m.srv.exitErr != nil { + m.lastErr = fmt.Errorf("rocm: server has exited: %w", m.srv.exitErr) + } else { + m.lastErr = fmt.Errorf("rocm: server has exited unexpectedly") + } m.mu.Unlock() return func(yield func(inference.Token) bool) {} } @@ -61,7 +65,11 @@ func (m *rocmModel) Generate(ctx context.Context, prompt string, opts ...inferen func (m *rocmModel) Chat(ctx context.Context, messages []inference.Message, opts ...inference.GenerateOption) iter.Seq[inference.Token] { if !m.srv.alive() { m.mu.Lock() - m.lastErr = fmt.Errorf("rocm: server has exited: %w", m.srv.exitErr) + if m.srv.exitErr != nil { + m.lastErr = fmt.Errorf("rocm: server has exited: %w", m.srv.exitErr) + } else { + m.lastErr = fmt.Errorf("rocm: server has exited unexpectedly") + } m.mu.Unlock() return func(yield func(inference.Token) bool) {} } diff --git a/server.go b/server.go index 1a1566e..a376b26 100644 --- a/server.go +++ b/server.go @@ -22,7 +22,7 @@ type server struct { port int client *llamacpp.Client exited chan struct{} - exitErr error + exitErr error // safe to read only after <-exited } // alive reports whether the llama-server process is still running.