X-Git-Url: http://git.giacomolli.uk/onechat/blobdiff_plain/e1e48ba388c28105fff3b70c8ca02304f5d57f53..6844f8c992ec4e276a3a0d93b544de0127eebbd2:/subagent.go?ds=sidebyside diff --git a/subagent.go b/subagent.go index 2e50d5d..07bfa45 100644 --- a/subagent.go +++ b/subagent.go @@ -124,14 +124,40 @@ func (s *Subagents) Get(ctx context.Context, name string) (*Subagent, error) { return subagent, nil } +// Snapshot flushes and locks the open logs while snapshot reads the subagent +// files. snapshot must not call Subagents or an open Subagent. +func (s *Subagents) Snapshot(ctx context.Context, snapshot func() error) error { + s.mutex.Lock() + defer s.mutex.Unlock() + + for _, subagent := range s.open { + subagent.mutex.Lock() + defer subagent.mutex.Unlock() + + err := subagent.Flush(ctx) + if err != nil { + return fmt.Errorf("flush subagent snapshot: %w", err) + } + } + + err := snapshot() + if err != nil { + return fmt.Errorf("copy subagent snapshot: %w", err) + } + + return nil +} + // Close makes the writes of each open log durable and closes it. func (s *Subagents) Close() error { s.mutex.Lock() defer s.mutex.Unlock() var err error + for name, subagent := range s.open { err = errors.Join(err, subagent.close()) + delete(s.open, name) }