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

// dlogger is the underlying implementation of the dlogger interface, selected
// at build time.
//
// We use a type alias instead of struct embedding so that the dlogger type is
// identical to the type returned by method chaining on the methods of this type.
type dlogger = *dloggerImpl

func dlog1() *dloggerImpl {
	return dlogImpl()
}

// dlogPerM is the per-M debug log data. This is embedded in the m
// struct.
type dlogPerM struct {
	dlogCache *dloggerImpl
}

// getCachedDlogger returns a cached dlogger if it can do so
// efficiently, or nil otherwise. The returned dlogger will be owned.
func getCachedDlogger() *dloggerImpl {
	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 *dloggerImpl
	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 *dloggerImpl) bool {
	mp := acquirem()
	if getg() != mp.gsignal && mp.dlogCache == nil {
		mp.dlogCache = l
		releasem(mp)
		return true
	}
	releasem(mp)
	return false
}
