45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
// Copyright 2019 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.
|
|
|
|
//go:build debuglog
|
|
|
|
package runtime
|
|
|
|
const dlogEnabled = true
|
|
|
|
// dlogPerM is the per-M debug log data. This is embedded in the m
|
|
// struct.
|
|
type dlogPerM struct {
|
|
dlogCache *dlogger
|
|
}
|
|
|
|
// getCachedDlogger returns a cached dlogger if it can do so
|
|
// efficiently, or nil otherwise. The returned dlogger will be owned.
|
|
func getCachedDlogger() *dlogger {
|
|
mp := acquirem()
|
|
// We don't return a cached dlogger if we're running on the
|
|
// signal stack in case the signal arrived while in
|
|
// get/putCachedDlogger. (Too bad we don't have non-atomic
|
|
// exchange!)
|
|
var l *dlogger
|
|
if getg() != mp.gsignal {
|
|
l = mp.dlogCache
|
|
mp.dlogCache = nil
|
|
}
|
|
releasem(mp)
|
|
return l
|
|
}
|
|
|
|
// putCachedDlogger attempts to return l to the local cache. It
|
|
// returns false if this fails.
|
|
func putCachedDlogger(l *dlogger) bool {
|
|
mp := acquirem()
|
|
if getg() != mp.gsignal && mp.dlogCache == nil {
|
|
mp.dlogCache = l
|
|
releasem(mp)
|
|
return true
|
|
}
|
|
releasem(mp)
|
|
return false
|
|
}
|