summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/util.cpp2
-rw-r--r--src/util.hpp27
2 files changed, 27 insertions, 2 deletions
diff --git a/src/util.cpp b/src/util.cpp
index 1f2bc05..db61bc2 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -24,6 +24,8 @@
#include <unistd.h>
+thread_local int ScopeTrace::indent = 0;
+
unique_fd::~unique_fd() {
if (this->fd != -1) {
close(this->fd);
diff --git a/src/util.hpp b/src/util.hpp
index ab9019b..ff173c8 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -18,10 +18,11 @@
#define WM_UTIL_HPP
#include <functional>
-#include <sys/poll.h>
-
+#include <thread>
#include <vector>
+#include <sys/poll.h>
+
extern "C" {
#include <afb/afb-binding.h>
};
@@ -49,6 +50,28 @@ extern "C" {
#define logdebug(...)
#endif
+#ifdef NDEBUG
+#define ST()
+#define STN(N)
+#else
+#define CONCAT_(X, Y) X##Y
+#define CONCAT(X, Y) CONCAT_(X, Y)
+
+#define ST() \
+ ScopeTrace __attribute__((unused)) CONCAT(trace_scope_, __LINE__)(__func__)
+#define STN(N) \
+ ScopeTrace __attribute__((unused)) CONCAT(named_trace_scope_, __LINE__)(#N)
+
+struct ScopeTrace {
+ thread_local static int indent;
+ char const *f{};
+ explicit ScopeTrace(char const *func) : f(func) {
+ fprintf(stderr, "%lu %*s%s -->\n", pthread_self(), 2 * indent++, "", this->f);
+ }
+ ~ScopeTrace() { fprintf(stderr, "%lu %*s%s <--\n", pthread_self(), 2 * --indent, "", this->f); }
+};
+#endif
+
// _ _ _ __ _
// ___| |_ _ __ _ _ ___| |_ _ _ _ __ (_) __ _ _ _ ___ / _| __| |
// / __| __| '__| | | |/ __| __| | | | | '_ \| |/ _` | | | |/ _ \ | |_ / _` |