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