| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package sync |
| |
| import ( |
| "sync" |
| |
| "v.io/x/ref/runtime/internal/testing/concurrency" |
| ) |
| |
| // Mutex is a wrapper around the Go implementation of Mutex. |
| type Mutex struct { |
| m sync.Mutex |
| } |
| |
| // MUTEX INTERFACE IMPLEMENTATION |
| |
| func (m *Mutex) Lock() { |
| if t := concurrency.T(); t != nil { |
| t.MutexLock(&m.m) |
| } else { |
| m.m.Lock() |
| } |
| } |
| |
| func (m *Mutex) Unlock() { |
| if t := concurrency.T(); t != nil { |
| t.MutexUnlock(&m.m) |
| } else { |
| m.m.Unlock() |
| } |
| } |
| |
| // RWMutex is a wrapper around the Go implementation of RWMutex. |
| type RWMutex struct { |
| m sync.RWMutex |
| } |
| |
| // RWMUTEX INTERFACE IMPLEMENTATION |
| |
| func (m *RWMutex) Lock() { |
| if t := concurrency.T(); t != nil { |
| t.RWMutexLock(&m.m) |
| } else { |
| m.m.Lock() |
| } |
| } |
| |
| func (m *RWMutex) RLock() { |
| if t := concurrency.T(); t != nil { |
| t.RWMutexRLock(&m.m) |
| } else { |
| m.m.RLock() |
| } |
| } |
| |
| func (m *RWMutex) RLocker() sync.Locker { |
| if t := concurrency.T(); t != nil { |
| return (*rlocker)(m) |
| } else { |
| return m.m.RLocker() |
| } |
| } |
| |
| func (m *RWMutex) RUnlock() { |
| if t := concurrency.T(); t != nil { |
| t.RWMutexRUnlock(&m.m) |
| } else { |
| m.m.RUnlock() |
| } |
| } |
| func (m *RWMutex) Unlock() { |
| if t := concurrency.T(); t != nil { |
| t.RWMutexUnlock(&m.m) |
| } else { |
| m.m.Unlock() |
| } |
| } |
| |
| type rlocker RWMutex |
| |
| func (r *rlocker) Lock() { |
| (*RWMutex)(r).RLock() |
| } |
| |
| func (r *rlocker) Unlock() { |
| (*RWMutex)(r).RUnlock() |
| } |