github.com/MerlinKodo/gvisor@v0.0.0-20231110090155-957f62ecf90e/pkg/sentry/fsimpl/tmpfs/filesystem_mutex.go (about) 1 package tmpfs 2 3 import ( 4 "reflect" 5 6 "github.com/MerlinKodo/gvisor/pkg/sync" 7 "github.com/MerlinKodo/gvisor/pkg/sync/locking" 8 ) 9 10 // RWMutex is sync.RWMutex with the correctness validator. 11 type filesystemRWMutex struct { 12 mu sync.RWMutex 13 } 14 15 // lockNames is a list of user-friendly lock names. 16 // Populated in init. 17 var filesystemlockNames []string 18 19 // lockNameIndex is used as an index passed to NestedLock and NestedUnlock, 20 // refering to an index within lockNames. 21 // Values are specified using the "consts" field of go_template_instance. 22 type filesystemlockNameIndex 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 *filesystemRWMutex) Lock() { 31 locking.AddGLock(filesystemprefixIndex, -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 *filesystemRWMutex) NestedLock(i filesystemlockNameIndex) { 38 locking.AddGLock(filesystemprefixIndex, int(i)) 39 m.mu.Lock() 40 } 41 42 // Unlock unlocks m. 43 // +checklocksignore 44 func (m *filesystemRWMutex) Unlock() { 45 m.mu.Unlock() 46 locking.DelGLock(filesystemprefixIndex, -1) 47 } 48 49 // NestedUnlock unlocks m knowing that another lock of the same type is held. 50 // +checklocksignore 51 func (m *filesystemRWMutex) NestedUnlock(i filesystemlockNameIndex) { 52 m.mu.Unlock() 53 locking.DelGLock(filesystemprefixIndex, int(i)) 54 } 55 56 // RLock locks m for reading. 57 // +checklocksignore 58 func (m *filesystemRWMutex) RLock() { 59 locking.AddGLock(filesystemprefixIndex, -1) 60 m.mu.RLock() 61 } 62 63 // RUnlock undoes a single RLock call. 64 // +checklocksignore 65 func (m *filesystemRWMutex) RUnlock() { 66 m.mu.RUnlock() 67 locking.DelGLock(filesystemprefixIndex, -1) 68 } 69 70 // RLockBypass locks m for reading without executing the validator. 71 // +checklocksignore 72 func (m *filesystemRWMutex) RLockBypass() { 73 m.mu.RLock() 74 } 75 76 // RUnlockBypass undoes a single RLockBypass call. 77 // +checklocksignore 78 func (m *filesystemRWMutex) RUnlockBypass() { 79 m.mu.RUnlock() 80 } 81 82 // DowngradeLock atomically unlocks rw for writing and locks it for reading. 83 // +checklocksignore 84 func (m *filesystemRWMutex) DowngradeLock() { 85 m.mu.DowngradeLock() 86 } 87 88 var filesystemprefixIndex *locking.MutexClass 89 90 // DO NOT REMOVE: The following function is automatically replaced. 91 func filesysteminitLockNames() {} 92 93 func init() { 94 filesysteminitLockNames() 95 filesystemprefixIndex = locking.NewMutexClass(reflect.TypeOf(filesystemRWMutex{}), filesystemlockNames) 96 }