FZGPUModules 2.0
GPU-accelerated modular compression pipelines
Loading...
Searching...
No Matches
log.h
Go to the documentation of this file.
1#pragma once
2
42#include <cstdarg>
43#include <cstdio>
44
45namespace fz {
46
47// ── Log levels ───────────────────────────────────────────────────────────────
48
49enum class LogLevel : int {
50 TRACE = 0,
51 DEBUG = 1,
52 INFO = 2,
53 WARN = 3,
54 SILENT = 255
55};
56
57// ── Logger ───────────────────────────────────────────────────────────────────
58
71class Logger {
72public:
73 using Callback = void(*)(LogLevel level, const char* msg);
74
75 // ── Sink configuration ────────────────────────────────────────────────
76
82 static void setCallback(Callback cb) { callback() = cb; }
83
93 static void setMinLevel(LogLevel level) { minLevel() = level; }
94 static LogLevel getMinLevel() { return minLevel(); }
95
100 static void enableStderr(LogLevel min_level = LogLevel::INFO) {
101 minLevel() = min_level;
102 setCallback([](LogLevel level, const char* msg) {
103 if (level >= Logger::minLevel()) {
104 fprintf(stderr, "[fzgmod:%s] %s\n", levelTag(level), msg);
105 }
106 });
107 }
108
109 // ── Logging ───────────────────────────────────────────────────────────
110
115 static void log(LogLevel level, const char* fmt, ...) {
116 if (!callback()) return;
117 if (level < minLevel()) return;
118 char buf[1024];
119 va_list args;
120 va_start(args, fmt);
121 vsnprintf(buf, sizeof(buf), fmt, args);
122 va_end(args);
123 callback()(level, buf);
124 }
125
134 static void print(const char* fmt, ...) {
135 char buf[1024];
136 va_list args;
137 va_start(args, fmt);
138 vsnprintf(buf, sizeof(buf), fmt, args);
139 va_end(args);
140 if (callback()) {
141 callback()(LogLevel::INFO, buf);
142 } else {
143 puts(buf);
144 }
145 }
146
147 static const char* levelTag(LogLevel l) {
148 switch (l) {
149 case LogLevel::TRACE: return "TRACE";
150 case LogLevel::DEBUG: return "DEBUG";
151 case LogLevel::INFO: return "INFO";
152 case LogLevel::WARN: return "WARN";
153 default: return "???";
154 }
155 }
156
157private:
158 static Callback& callback() {
159 static Callback cb = nullptr;
160 return cb;
161 }
162 static LogLevel& minLevel() {
163 static LogLevel lvl = LogLevel::INFO;
164 return lvl;
165 }
166};
167
168} // namespace fz
169
170// ── Compile-time level gating ─────────────────────────────────────────────────
171//
172// FZ_LOG_MIN_LEVEL is set by CMake (default 2 = INFO). Log calls below this
173// level expand to ((void)0) — the compiler eliminates them entirely and their
174// arguments are never evaluated, giving true zero overhead.
175//
176// Override at the CMake level:
177// cmake -DFZ_LOG_MIN_LEVEL=0 # full TRACE logging (debug builds)
178// cmake -DFZ_LOG_MIN_LEVEL=255 # all logging compiled out (embedded)
179
180#ifndef FZ_LOG_MIN_LEVEL
181# define FZ_LOG_MIN_LEVEL 2 // INFO
182#endif
183
184// FZ_LOG_DISABLE is kept for backward compatibility; equivalent to SILENT.
185#ifdef FZ_LOG_DISABLE
186# undef FZ_LOG_MIN_LEVEL
187# define FZ_LOG_MIN_LEVEL 255
188#endif
189
201#define FZ_LOG(level, ...) \
202 do { \
203 if constexpr (static_cast<int>(::fz::LogLevel::level) >= \
204 static_cast<int>(FZ_LOG_MIN_LEVEL)) { \
205 ::fz::Logger::log(::fz::LogLevel::level, __VA_ARGS__); \
206 } \
207 } while (0)
208
218#define FZ_PRINT(...) ::fz::Logger::print(__VA_ARGS__)
Definition log.h:71
static void setCallback(Callback cb)
Definition log.h:82
static void log(LogLevel level, const char *fmt,...)
Definition log.h:115
static void enableStderr(LogLevel min_level=LogLevel::INFO)
Definition log.h:100
static void setMinLevel(LogLevel level)
Definition log.h:93
static void print(const char *fmt,...)
Definition log.h:134
LogLevel
Definition log.h:49
@ TRACE
Per-stage execute(), per-chunk details — very verbose.
@ WARN
Unexpected but recoverable: outlier overflow, fallbacks.
@ INFO
High-level milestones: finalize, compress, decompress.
@ SILENT
Compile-time sentinel — do not pass to log()
@ DEBUG
Pipeline construction, buffer allocation, data stats.