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