forked from keybase/kbfs
/
observer_list.go
67 lines (57 loc) · 1.48 KB
/
observer_list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright 2016 Keybase Inc. All rights reserved.
// Use of this source code is governed by a BSD
// license that can be found in the LICENSE file.
package libkbfs
import (
"sync"
"golang.org/x/net/context"
)
// observerList is a thread-safe list of observers.
type observerList struct {
lock sync.RWMutex
observers []Observer
}
func newObserverList() *observerList {
return &observerList{}
}
// It's the caller's responsibility to make sure add isn't called
// twice for the same Observer.
func (ol *observerList) add(o Observer) {
ol.lock.Lock()
defer ol.lock.Unlock()
ol.observers = append(ol.observers, o)
}
func (ol *observerList) remove(o Observer) {
ol.lock.Lock()
defer ol.lock.Unlock()
for i, oldObs := range ol.observers {
if oldObs == o {
ol.observers = append(ol.observers[:i], ol.observers[i+1:]...)
return
}
}
}
func (ol *observerList) localChange(
ctx context.Context, node Node, write WriteRange) {
ol.lock.RLock()
defer ol.lock.RUnlock()
for _, o := range ol.observers {
o.LocalChange(ctx, node, write)
}
}
func (ol *observerList) batchChanges(
ctx context.Context, changes []NodeChange, affectedNodeIDs []NodeID) {
ol.lock.RLock()
defer ol.lock.RUnlock()
for _, o := range ol.observers {
o.BatchChanges(ctx, changes, affectedNodeIDs)
}
}
func (ol *observerList) tlfHandleChange(
ctx context.Context, newHandle *TlfHandle) {
ol.lock.RLock()
defer ol.lock.RUnlock()
for _, o := range ol.observers {
o.TlfHandleChange(ctx, newHandle)
}
}