// 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/profiles/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()
}
