diff options
Diffstat (limited to 'src/pkg/sync/mutex.go')
-rw-r--r-- | src/pkg/sync/mutex.go | 52 |
1 files changed, 3 insertions, 49 deletions
diff --git a/src/pkg/sync/mutex.go b/src/pkg/sync/mutex.go index bf19f0dec..9ba628824 100644 --- a/src/pkg/sync/mutex.go +++ b/src/pkg/sync/mutex.go @@ -20,6 +20,9 @@ type Mutex struct { sema uint32; } +// Add delta to *val, and return the new *val in a thread-safe way. If multiple +// goroutines call xadd on the same val concurrently, the changes will be +// serialized, and all the deltas will be added in an undefined order. func xadd(val *uint32, delta int32) (new uint32) { for { v := *val; @@ -55,52 +58,3 @@ func (m *Mutex) Unlock() { } runtime.Semrelease(&m.sema); } - -// Stub implementation of r/w locks. -// This satisfies the semantics but -// is not terribly efficient. - -// The next comment goes in the BUGS section of the document, -// in its own paragraph, without the (rsc) tag. - -// BUG(rsc): RWMutex does not (yet) allow multiple readers; -// instead it behaves as if RLock and RUnlock were Lock and Unlock. - -// An RWMutex is a reader/writer mutual exclusion lock. -// The lock can be held by an arbitrary number of readers -// or a single writer. -// RWMutexes can be created as part of other -// structures; the zero value for a RWMutex is -// an unlocked mutex. -type RWMutex struct { - m Mutex; -} - -// RLock locks rw for reading. -// If the lock is already locked for writing or there is a writer already waiting -// to acquire the lock, RLock blocks until the writer has released the lock. -func (rw *RWMutex) RLock() { rw.m.Lock() } - -// RUnlock undoes a single RLock call; -// it does not affect other simultaneous readers. -// It is a run-time error if rw is not locked for reading -// on entry to RUnlock. -func (rw *RWMutex) RUnlock() { rw.m.Unlock() } - -// Lock locks rw for writing. -// If the lock is already locked for reading or writing, -// Lock blocks until the lock is available. -// To ensure that the lock eventually becomes available, -// a blocked Lock call excludes new readers from acquiring -// the lock. -func (rw *RWMutex) Lock() { rw.m.Lock() } - -// Unlock unlocks rw for writing. -// It is a run-time error if rw is not locked for writing -// on entry to Unlock. -// -// Like for Mutexes, -// a locked RWMutex is not associated with a particular goroutine. -// It is allowed for one goroutine to RLock (Lock) an RWMutex and then -// arrange for another goroutine to RUnlock (Unlock) it. -func (rw *RWMutex) Unlock() { rw.m.Unlock() } |