bucket_mutex.go raw
1 package stack
2
3 import (
4 "reflect"
5
6 "gvisor.dev/gvisor/pkg/sync"
7 "gvisor.dev/gvisor/pkg/sync/locking"
8 )
9
10 // RWMutex is sync.RWMutex with the correctness validator.
11 type bucketRWMutex struct {
12 mu sync.RWMutex
13 }
14
15 // lockNames is a list of user-friendly lock names.
16 // Populated in init.
17 var bucketlockNames []string
18
19 // lockNameIndex is used as an index passed to NestedLock and NestedUnlock,
20 // referring to an index within lockNames.
21 // Values are specified using the "consts" field of go_template_instance.
22 type bucketlockNameIndex int
23
24 // DO NOT REMOVE: The following function automatically replaced with lock index constants.
25 const (
26 bucketLockOthertuple = bucketlockNameIndex(0)
27 )
28 const ()
29
30 // Lock locks m.
31 // +checklocksignore
32 func (m *bucketRWMutex) Lock() {
33 locking.AddGLock(bucketprefixIndex, -1)
34 m.mu.Lock()
35 }
36
37 // NestedLock locks m knowing that another lock of the same type is held.
38 // +checklocksignore
39 func (m *bucketRWMutex) NestedLock(i bucketlockNameIndex) {
40 locking.AddGLock(bucketprefixIndex, int(i))
41 m.mu.Lock()
42 }
43
44 // Unlock unlocks m.
45 // +checklocksignore
46 func (m *bucketRWMutex) Unlock() {
47 m.mu.Unlock()
48 locking.DelGLock(bucketprefixIndex, -1)
49 }
50
51 // NestedUnlock unlocks m knowing that another lock of the same type is held.
52 // +checklocksignore
53 func (m *bucketRWMutex) NestedUnlock(i bucketlockNameIndex) {
54 m.mu.Unlock()
55 locking.DelGLock(bucketprefixIndex, int(i))
56 }
57
58 // RLock locks m for reading.
59 // +checklocksignore
60 func (m *bucketRWMutex) RLock() {
61 locking.AddGLock(bucketprefixIndex, -1)
62 m.mu.RLock()
63 }
64
65 // RUnlock undoes a single RLock call.
66 // +checklocksignore
67 func (m *bucketRWMutex) RUnlock() {
68 m.mu.RUnlock()
69 locking.DelGLock(bucketprefixIndex, -1)
70 }
71
72 // RLockBypass locks m for reading without executing the validator.
73 // +checklocksignore
74 func (m *bucketRWMutex) RLockBypass() {
75 m.mu.RLock()
76 }
77
78 // RUnlockBypass undoes a single RLockBypass call.
79 // +checklocksignore
80 func (m *bucketRWMutex) RUnlockBypass() {
81 m.mu.RUnlock()
82 }
83
84 // DowngradeLock atomically unlocks rw for writing and locks it for reading.
85 // +checklocksignore
86 func (m *bucketRWMutex) DowngradeLock() {
87 m.mu.DowngradeLock()
88 }
89
90 var bucketprefixIndex *locking.MutexClass
91
92 // DO NOT REMOVE: The following function is automatically replaced.
93 func bucketinitLockNames() { bucketlockNames = []string{"otherTuple"} }
94
95 func init() {
96 bucketinitLockNames()
97 bucketprefixIndex = locking.NewMutexClass(reflect.TypeOf(bucketRWMutex{}), bucketlockNames)
98 }
99