From 0b0b25222b3131ada79ff78c28eb8bf07d977deb Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Tue, 15 Sep 2026 15:35:52 -0400 Subject: feat: single-owner game state, transactional lifecycle, durable money on server stop --- internal/engine/tick.go | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'internal/engine/tick.go') diff --git a/internal/engine/tick.go b/internal/engine/tick.go index 00a9c60..74b1dcf 100644 --- a/internal/engine/tick.go +++ b/internal/engine/tick.go @@ -93,6 +93,16 @@ func (e *Engine) Stop() { } } +// StopAndWait stops the ticker AND joins any in-flight callback: it waits +// until the currently running tick has completed and the loop goroutine has +// exited. Use this for graceful shutdown, where the final tick must finish +// before owned state is saved. +func (e *Engine) StopAndWait() { + e.Stop() + e.tickMu.Lock() + e.tickMu.Unlock() +} + // Tick fires every due subscriber synchronously and returns. Subscribers // are invoked in ascending subscription-ID (registration) order. Tick calls // are serialized; a callback must not call Tick recursively. -- cgit v1.2.3