返回 DeepSeek-Reasonix
shutdown_steps.go
根目录 / desktop / shutdown_steps.go
1 package main
2
3 import (
4 "log/slog"
5 "time"
6 )
7
8 func (c *desktopShutdownCoordinator) runStep(name string, run func()) {
9 _ = c.runErrorStep(name, func() error { run(); return nil })
10 }
11
12 // The coordinator serializes attempts. Only successful steps are checkpointed;
13 // a retry must revisit a failed service while preserving completed resources.
14 func (c *desktopShutdownCoordinator) runErrorStep(name string, run func() error) (err error) {
15 c.mu.Lock()
16 done := c.finished[name]
17 c.mu.Unlock()
18 if done {
19 return nil
20 }
21 started := time.Now()
22 slog.Debug("desktop: shutdown step", "step", name, "outcome", "started")
23 completed := false
24 defer func() {
25 outcome := "failed"
26 if completed {
27 outcome = "completed"
28 }
29 if completed {
30 slog.Debug("desktop: shutdown step", "step", name, "outcome", outcome, "duration_ms", time.Since(started).Milliseconds())
31 } else {
32 slog.Warn("desktop: shutdown step failed", "step", name, "outcome", outcome, "duration_ms", time.Since(started).Milliseconds(), "err", err)
33 }
34 }()
35 if err = run(); err != nil {
36 return err
37 }
38 c.mu.Lock()
39 c.finished[name] = true
40 c.mu.Unlock()
41 completed = true
42 return nil
43 }
44
44 lines GO