bridge_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 bridgeRWMutex struct {
12 mu sync.RWMutex
13 }
14
15 // lockNames is a list of user-friendly lock names.
16 // Populated in init.
17 var bridgelockNames []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 bridgelockNameIndex int
23
24 // DO NOT REMOVE: The following function automatically replaced with lock index constants.
25 // LOCK_NAME_INDEX_CONSTANTS
26 const ()
27
28 // Lock locks m.
29 // +checklocksignore
30 func (m *bridgeRWMutex) Lock() {
31 locking.AddGLock(bridgeprefixIndex, -1)
32 m.mu.Lock()
33 }
34
35 // NestedLock locks m knowing that another lock of the same type is held.
36 // +checklocksignore
37 func (m *bridgeRWMutex) NestedLock(i bridgelockNameIndex) {
38 locking.AddGLock(bridgeprefixIndex, int(i))
39 m.mu.Lock()
40 }
41
42 // Unlock unlocks m.
43 // +checklocksignore
44 func (m *bridgeRWMutex) Unlock() {
45 m.mu.Unlock()
46 locking.DelGLock(bridgeprefixIndex, -1)
47 }
48
49 // NestedUnlock unlocks m knowing that another lock of the same type is held.
50 // +checklocksignore
51 func (m *bridgeRWMutex) NestedUnlock(i bridgelockNameIndex) {
52 m.mu.Unlock()
53 locking.DelGLock(bridgeprefixIndex, int(i))
54 }
55
56 // RLock locks m for reading.
57 // +checklocksignore
58 func (m *bridgeRWMutex) RLock() {
59 locking.AddGLock(bridgeprefixIndex, -1)
60 m.mu.RLock()
61 }
62
63 // RUnlock undoes a single RLock call.
64 // +checklocksignore
65 func (m *bridgeRWMutex) RUnlock() {
66 m.mu.RUnlock()
67 locking.DelGLock(bridgeprefixIndex, -1)
68 }
69
70 // RLockBypass locks m for reading without executing the validator.
71 // +checklocksignore
72 func (m *bridgeRWMutex) RLockBypass() {
73 m.mu.RLock()
74 }
75
76 // RUnlockBypass undoes a single RLockBypass call.
77 // +checklocksignore
78 func (m *bridgeRWMutex) RUnlockBypass() {
79 m.mu.RUnlock()
80 }
81
82 // DowngradeLock atomically unlocks rw for writing and locks it for reading.
83 // +checklocksignore
84 func (m *bridgeRWMutex) DowngradeLock() {
85 m.mu.DowngradeLock()
86 }
87
88 var bridgeprefixIndex *locking.MutexClass
89
90 // DO NOT REMOVE: The following function is automatically replaced.
91 func bridgeinitLockNames() {}
92
93 func init() {
94 bridgeinitLockNames()
95 bridgeprefixIndex = locking.NewMutexClass(reflect.TypeOf(bridgeRWMutex{}), bridgelockNames)
96 }
97