Source File
cond.go
Belonging Package
sync
// Copyright 2011 The Go 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 syncimport ()// Cond implements a condition variable, a rendezvous point// for goroutines waiting for or announcing the occurrence// of an event.//// Each Cond has an associated Locker L (often a *Mutex or *RWMutex),// which must be held when changing the condition and// when calling the Wait method.//// A Cond must not be copied after first use.type Cond struct {noCopy noCopy// L is held while observing or changing the conditionL Lockernotify notifyListchecker copyChecker}// NewCond returns a new Cond with Locker l.func ( Locker) *Cond {return &Cond{L: }}// Wait atomically unlocks c.L and suspends execution// of the calling goroutine. After later resuming execution,// Wait locks c.L before returning. Unlike in other systems,// Wait cannot return unless awoken by Broadcast or Signal.//// Because c.L is not locked when Wait first resumes, the caller// typically cannot assume that the condition is true when// Wait returns. Instead, the caller should Wait in a loop://// c.L.Lock()// for !condition() {// c.Wait()// }// ... make use of condition ...// c.L.Unlock()//func ( *Cond) () {.checker.check():= runtime_notifyListAdd(&.notify).L.Unlock()runtime_notifyListWait(&.notify, ).L.Lock()}// Signal wakes one goroutine waiting on c, if there is any.//// It is allowed but not required for the caller to hold c.L// during the call.func ( *Cond) () {.checker.check()runtime_notifyListNotifyOne(&.notify)}// Broadcast wakes all goroutines waiting on c.//// It is allowed but not required for the caller to hold c.L// during the call.func ( *Cond) () {.checker.check()runtime_notifyListNotifyAll(&.notify)}// copyChecker holds back pointer to itself to detect object copying.type copyChecker uintptrfunc ( *copyChecker) () {if uintptr(*) != uintptr(unsafe.Pointer()) &&!atomic.CompareAndSwapUintptr((*uintptr)(), 0, uintptr(unsafe.Pointer())) &&uintptr(*) != uintptr(unsafe.Pointer()) {panic("sync.Cond is copied")}}// noCopy may be embedded into structs which must not be copied// after the first use.//// See https://golang.org/issues/8005#issuecomment-190753527// for details.type noCopy struct{}// Lock is a no-op used by -copylocks checker from `go vet`.func (*noCopy) () {}func (*noCopy) () {}