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