mirror of
https://github.com/jetkvm/kvm.git
synced 2026-05-21 05:20:35 +00:00
d1027206bc
* Enhance synctrace logging. Switched the maps to be indexed by the .Pointer (not a string) Grouped the lockCount, unlockCount ,and lastLock in an trackingEntry so we can detect unlocks of something that wasn't ever locked and excessive unlocks and also tracks the first time locked and the last unlock time. Added LogDangledLocks for debugging use. Added a panic handler to the Main so we can log out panics * Switch to traceable sync for most everything * More documentation * Update internal/sync/log.go * Update DEVELOPMENT.md * Resolve merge issue. * Applied review comments * Restore --enable-sync-trace option. * Use WithLevel so we can re-panic as desired
97 lines
1.6 KiB
Go
97 lines
1.6 KiB
Go
//go:build !synctrace
|
|
|
|
package sync
|
|
|
|
import (
|
|
gosync "sync"
|
|
)
|
|
|
|
// Mutex is a wrapper around the sync.Mutex
|
|
type Mutex struct {
|
|
mu gosync.Mutex
|
|
}
|
|
|
|
// Lock locks the mutex
|
|
func (m *Mutex) Lock() {
|
|
m.mu.Lock()
|
|
}
|
|
|
|
// Unlock unlocks the mutex
|
|
func (m *Mutex) Unlock() {
|
|
m.mu.Unlock()
|
|
}
|
|
|
|
// TryLock tries to lock the mutex
|
|
func (m *Mutex) TryLock() bool {
|
|
return m.mu.TryLock()
|
|
}
|
|
|
|
// RWMutex is a wrapper around the sync.RWMutex
|
|
type RWMutex struct {
|
|
mu gosync.RWMutex
|
|
}
|
|
|
|
// Lock locks the mutex
|
|
func (m *RWMutex) Lock() {
|
|
m.mu.Lock()
|
|
}
|
|
|
|
// Unlock unlocks the mutex
|
|
func (m *RWMutex) Unlock() {
|
|
m.mu.Unlock()
|
|
}
|
|
|
|
// RLock locks the mutex for reading
|
|
func (m *RWMutex) RLock() {
|
|
m.mu.RLock()
|
|
}
|
|
|
|
// RUnlock unlocks the mutex for reading
|
|
func (m *RWMutex) RUnlock() {
|
|
m.mu.RUnlock()
|
|
}
|
|
|
|
// TryRLock tries to lock the mutex for reading
|
|
func (m *RWMutex) TryRLock() bool {
|
|
return m.mu.TryRLock()
|
|
}
|
|
|
|
// TryLock tries to lock the mutex
|
|
func (m *RWMutex) TryLock() bool {
|
|
return m.mu.TryLock()
|
|
}
|
|
|
|
// WaitGroup is a wrapper around the sync.WaitGroup
|
|
type WaitGroup struct {
|
|
wg gosync.WaitGroup
|
|
}
|
|
|
|
// Add adds a function to the wait group
|
|
func (w *WaitGroup) Add(delta int) {
|
|
w.wg.Add(delta)
|
|
}
|
|
|
|
// Done decrements the wait group counter
|
|
func (w *WaitGroup) Done() {
|
|
w.wg.Done()
|
|
}
|
|
|
|
// Wait waits for the wait group to finish
|
|
func (w *WaitGroup) Wait() {
|
|
w.wg.Wait()
|
|
}
|
|
|
|
// Once is a wrapper around the sync.Once
|
|
type Once struct {
|
|
mu gosync.Once
|
|
}
|
|
|
|
// Do calls the function f if and only if Do has not been called before for this instance of Once.
|
|
func (o *Once) Do(f func()) {
|
|
o.mu.Do(f)
|
|
}
|
|
|
|
// LogDangledLocks is a no-op in non-synctrace builds
|
|
func LogDangledLocks() {
|
|
}
|