...
1 package sync
2
3 import "sync"
4
5
6
7
8
9
10 type OnceErr struct {
11 mu sync.RWMutex
12 err error
13 ch chan struct{}
14 }
15
16
17 func NewOnceErr() *OnceErr {
18 return &OnceErr{
19 ch: make(chan struct{}, 1),
20 }
21 }
22
23
24
25 func (e *OnceErr) Err() error {
26 e.mu.RLock()
27 err := e.err
28 e.mu.RUnlock()
29
30 return err
31 }
32
33
34
35 func (e *OnceErr) SetError(err error) {
36 if err == nil {
37 return
38 }
39
40 e.mu.Lock()
41 if e.err == nil {
42 e.err = err
43 close(e.ch)
44 }
45 e.mu.Unlock()
46 }
47
48
49
50
51 func (e *OnceErr) ErrorSet() <-chan struct{} {
52 return e.ch
53 }
54
View as plain text