summaryrefslogtreecommitdiff
path: root/internal/tui/tui.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-13 14:41:28 +0300
committerPaul Buetow <paul@buetow.org>2026-05-13 14:41:28 +0300
commitde3405c275898c8cd528a636dbd40e1b685cfaa5 (patch)
tree53711959800677aa694e18331476add24a21b8ef /internal/tui/tui.go
parentd392eebe5bd127e1573734321b0cabaad4182d7c (diff)
use errgroup instead of WaitGroup for concurrent snapshot builders
Replace sync.WaitGroup with errgroup.Group in buildSubSnapshots so errors from sub-builders (buildSyscallSnapshots, buildFileSnapshots, buildProcessSnapshots, buildHistogramSnapshot) are captured and propagated rather than silently dropped. Change Engine.Snapshot() to return (*Snapshot, error), update runtime.SnapshotSource and dashboard.SnapshotSource interfaces accordingly, and adjust all callers in tui.go, dashboard/model.go, and the test helpers. Each sub-builder now returns (result, error); the error return is currently always nil but establishes the contract for future validation. The per-type Snapshot() convenience methods (histogram, syscall, file, process) panic on error since they are internal helpers where failure would be a programming bug. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/tui/tui.go')
-rw-r--r--internal/tui/tui.go17
1 files changed, 12 insertions, 5 deletions
diff --git a/internal/tui/tui.go b/internal/tui/tui.go
index eee4252..2cebaf2 100644
--- a/internal/tui/tui.go
+++ b/internal/tui/tui.go
@@ -225,6 +225,9 @@ func (r *runtimeBindings) advanceFilterEpoch() uint64 {
return r.filterEpoch.Add(1)
}
+// resetDashboardSnapshotSource resets the dashboard snapshot source if it
+// implements the resettable interface, then returns a fresh snapshot. Errors
+// from Snapshot are silently dropped since callers handle a nil snapshot.
func (r *runtimeBindings) resetDashboardSnapshotSource() *statsengine.Snapshot {
src := r.dashboardSnapshotSource()
if src == nil {
@@ -232,10 +235,11 @@ func (r *runtimeBindings) resetDashboardSnapshotSource() *statsengine.Snapshot {
}
if resettable, ok := src.(interface {
Reset()
- Snapshot() *statsengine.Snapshot
+ Snapshot() (*statsengine.Snapshot, error)
}); ok {
resettable.Reset()
- return resettable.Snapshot()
+ snap, _ := resettable.Snapshot()
+ return snap
}
return nil
}
@@ -1216,13 +1220,16 @@ type lateBoundDashboardSource struct {
runtime *runtimeBindings
}
-func (s lateBoundDashboardSource) Snapshot() *statsengine.Snapshot {
+// Snapshot returns a point-in-time dashboard snapshot from the underlying
+// source, or (nil, nil) when no source is available. Errors are forwarded to
+// the caller so they can decide how to handle a failed snapshot build.
+func (s lateBoundDashboardSource) Snapshot() (*statsengine.Snapshot, error) {
if s.runtime == nil {
- return nil
+ return nil, nil
}
source := s.runtime.dashboardSnapshotSource()
if source == nil {
- return nil
+ return nil, nil
}
return source.Snapshot()
}