ebiten/internal/debug/debug_ebitenginedebug.go
2024-08-07 23:48:35 +09:00

78 lines
2.1 KiB
Go

// Copyright 2020 The Ebiten Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build ebitenginedebug || ebitendebug
package debug
import (
"fmt"
"sync"
)
const IsDebug = true
var theFrameLogger = &frameLogger{}
var flushM sync.Mutex
// FrameLogf calls the current global logger's FrameLogf.
// FrameLogf buffers the arguments and doesn't dump the log immediately.
// You can dump logs by calling SwitchLogger and Flush.
//
// FrameLogf is not concurrent safe.
// FrameLogf and SwitchFrameLogger must be called from the same goroutine.
func FrameLogf(format string, args ...any) {
theFrameLogger.FrameLogf(format, args...)
}
// SwitchFrameLogger sets a new logger as the current logger and returns the original global logger.
// The new global logger and the returned logger have separate statuses, so you can use them for different goroutines.
//
// SwitchFrameLogger and a returned Logger are not concurrent safe.
// FrameLogf and SwitchFrameLogger must be called from the same goroutine.
func SwitchFrameLogger() FrameLogger {
current := theFrameLogger
theFrameLogger = &frameLogger{}
return current
}
type frameLogger struct {
items []logItem
}
type logItem struct {
format string
args []any
}
func (l *frameLogger) FrameLogf(format string, args ...any) {
l.items = append(l.items, logItem{
format: format,
args: args,
})
}
func (l *frameLogger) Flush() {
// Flushing is protected by a mutex not to mix another logger's logs.
flushM.Lock()
defer flushM.Unlock()
for i, item := range l.items {
fmt.Printf(item.format, item.args...)
l.items[i] = logItem{}
}
l.items = l.items[:0]
}