mirror of
https://github.com/golang/go
synced 2024-11-22 19:54:39 -07:00
a2c396ce00
This change adds 3 new waitReasons that correspond to sync.Mutex.Lock, sync.RWMutex.RLock, and sync.RWMutex.Lock that are plumbed down into semacquire1 by exporting new functions to the sync package from the runtime. Currently these three functions show up as "semacquire" in backtraces which isn't very clear, though the stack trace itself should reveal what's really going on. This represents a minor improvement to backtrace readability, though blocking on an RWMutex.w.Lock will still show up as blocking on a regular mutex (I suppose technically it is). This is a step toward helping the runtime identify when a goroutine is blocked on a mutex of some kind. For #49881. Change-Id: Ia409b4d27e117fe4bfdc25fa541e9c58d6d587b9 Reviewed-on: https://go-review.googlesource.com/c/go/+/427616 TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com>
64 lines
2.3 KiB
Go
64 lines
2.3 KiB
Go
// Copyright 2012 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 sync
|
|
|
|
import "unsafe"
|
|
|
|
// defined in package runtime
|
|
|
|
// Semacquire waits until *s > 0 and then atomically decrements it.
|
|
// It is intended as a simple sleep primitive for use by the synchronization
|
|
// library and should not be used directly.
|
|
func runtime_Semacquire(s *uint32)
|
|
|
|
// Semacquire(RW)Mutex(R) is like Semacquire, but for profiling contended
|
|
// Mutexes and RWMutexes.
|
|
// If lifo is true, queue waiter at the head of wait queue.
|
|
// skipframes is the number of frames to omit during tracing, counting from
|
|
// runtime_SemacquireMutex's caller.
|
|
// The different forms of this function just tell the runtime how to present
|
|
// the reason for waiting in a backtrace, and is used to compute some metrics.
|
|
// Otherwise they're functionally identical.
|
|
func runtime_SemacquireMutex(s *uint32, lifo bool, skipframes int)
|
|
func runtime_SemacquireRWMutexR(s *uint32, lifo bool, skipframes int)
|
|
func runtime_SemacquireRWMutex(s *uint32, lifo bool, skipframes int)
|
|
|
|
// Semrelease atomically increments *s and notifies a waiting goroutine
|
|
// if one is blocked in Semacquire.
|
|
// It is intended as a simple wakeup primitive for use by the synchronization
|
|
// library and should not be used directly.
|
|
// If handoff is true, pass count directly to the first waiter.
|
|
// skipframes is the number of frames to omit during tracing, counting from
|
|
// runtime_Semrelease's caller.
|
|
func runtime_Semrelease(s *uint32, handoff bool, skipframes int)
|
|
|
|
// See runtime/sema.go for documentation.
|
|
func runtime_notifyListAdd(l *notifyList) uint32
|
|
|
|
// See runtime/sema.go for documentation.
|
|
func runtime_notifyListWait(l *notifyList, t uint32)
|
|
|
|
// See runtime/sema.go for documentation.
|
|
func runtime_notifyListNotifyAll(l *notifyList)
|
|
|
|
// See runtime/sema.go for documentation.
|
|
func runtime_notifyListNotifyOne(l *notifyList)
|
|
|
|
// Ensure that sync and runtime agree on size of notifyList.
|
|
func runtime_notifyListCheck(size uintptr)
|
|
func init() {
|
|
var n notifyList
|
|
runtime_notifyListCheck(unsafe.Sizeof(n))
|
|
}
|
|
|
|
// Active spinning runtime support.
|
|
// runtime_canSpin reports whether spinning makes sense at the moment.
|
|
func runtime_canSpin(i int) bool
|
|
|
|
// runtime_doSpin does active spinning.
|
|
func runtime_doSpin()
|
|
|
|
func runtime_nanotime() int64
|