gvisor.dev/gvisor@v0.0.0-20240520182842-f9d4d51c7e0f/tools/checklocks/test/rwmutex.go (about) 1 // Copyright 2021 The gVisor Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package test 16 17 import ( 18 "sync" 19 ) 20 21 // oneReadGuardStruct has one read-guarded field. 22 type oneReadGuardStruct struct { 23 mu sync.RWMutex 24 // +checklocks:mu 25 guardedField int 26 } 27 28 func testRWAccessValidRead(tc *oneReadGuardStruct) { 29 tc.mu.Lock() 30 _ = tc.guardedField 31 tc.mu.Unlock() 32 tc.mu.RLock() 33 _ = tc.guardedField 34 tc.mu.RUnlock() 35 } 36 37 func testRWAccessValidWrite(tc *oneReadGuardStruct) { 38 tc.mu.Lock() 39 tc.guardedField = 1 40 tc.mu.Unlock() 41 } 42 43 func testRWAccessInvalidWrite(tc *oneReadGuardStruct) { 44 tc.guardedField = 2 // +checklocksfail 45 tc.mu.RLock() 46 tc.guardedField = 2 // +checklocksfail 47 tc.mu.RUnlock() 48 } 49 50 func testRWAccessInvalidRead(tc *oneReadGuardStruct) { 51 _ = tc.guardedField // +checklocksfail 52 }