Fix race in locker call to dec()
Can't safely use uint32 for locker since we need to decrement the count, which requires loading the unit and doing some math, which is inherintly racey. Instead use Int32 which we can safely use with atomic and AddInt32 with `-1` Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
parent
0fb39140d9
commit
058c4dfc3e
2 changed files with 39 additions and 5 deletions
|
@ -32,22 +32,23 @@ type Locker struct {
|
|||
type lockCtr struct {
|
||||
mu sync.Mutex
|
||||
// waiters is the number of waiters waiting to acquire the lock
|
||||
waiters uint32
|
||||
// this is int32 instead of uint32 so we can add `-1` in `dec()`
|
||||
waiters int32
|
||||
}
|
||||
|
||||
// inc increments the number of waiters waiting for the lock
|
||||
func (l *lockCtr) inc() {
|
||||
atomic.AddUint32(&l.waiters, 1)
|
||||
atomic.AddInt32(&l.waiters, 1)
|
||||
}
|
||||
|
||||
// dec decrements the number of waiters wating on the lock
|
||||
func (l *lockCtr) dec() {
|
||||
atomic.AddUint32(&l.waiters, ^uint32(l.waiters-1))
|
||||
atomic.AddInt32(&l.waiters, -1)
|
||||
}
|
||||
|
||||
// count gets the current number of waiters
|
||||
func (l *lockCtr) count() uint32 {
|
||||
return atomic.LoadUint32(&l.waiters)
|
||||
func (l *lockCtr) count() int32 {
|
||||
return atomic.LoadInt32(&l.waiters)
|
||||
}
|
||||
|
||||
// Lock locks the mutex
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue