| // 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 | |
| // +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 | |
| } |