12 #if defined(__has_builtin) // we probably use CLANG
13 #if __has_builtin(__builtin_FUNCTION)
14 #define __useBuiltinFunction__
16 #else // we probably use GCC
17 #define __useBuiltinFunction__
34 auto cmp = strcmp(lhs->
file, rhs->
file);
49 static std::set<anchor*, pointerCompare>&
getList() {
50 static std::set<anchor*, pointerCompare> list;
55 #ifdef __useBuiltinFunction__
57 const char *aFunc = __builtin_FUNCTION(),
58 int aLine = __builtin_LINE(),
59 const char *aFile = __builtin_FILE()):
61 anchor(const char * aSubFunc,
62 const char *aFunc =
"unknown",
64 const char *aFile =
"unknown"):
85 static void print(std::ostream& out,
const std::string& prefix);
91 item->maxTimeSpent = 0;
100 start = clock_type::now();
102 static inline void updateMax(std::atomic<std::int64_t>& max, std::int64_t val) {
103 auto oldMax = max.load();
104 while (val > oldMax &&
105 !max.compare_exchange_weak(oldMax, val));
109 auto timeSpent = clock_type::now() -
start;
110 auto timeSpentNs = std::chrono::duration_cast<std::chrono::nanoseconds>(timeSpent).count();
114 static inline const std::string&
stringy(
const std::string& s) {
117 static inline const std::string
stringy(
const std::vector<char>& s) {
118 return std::string(s.data());
121 template <
class T>
void stop(clock_type::duration timeout,
const T&
object) {
123 auto timeSpent = clock_type::now() -
start;
124 auto timeSpentNs = std::chrono::duration_cast<std::chrono::nanoseconds>(timeSpent).count();
127 if (timeSpent > timeout) {
128 const std::string& oref(
stringy(
object));
130 oref,
lAnchor.
subfunc,
"tardy action took ", std::chrono::duration_cast<std::chrono::duration<double>>(timeSpent).count(),
"s");
134 start = clock_type::now();
157 #define timerInst(subfunc) static timer::anchor aUniqueName##subfunc(#subfunc); timer::instance iUniqueName##subfunc(aUniqueName##subfunc)
158 #define timerInstTO(subfunc,timeout,object) static timer::anchor aUniqueName##subfunc(#subfunc); timer::instanceWithTimeout<decltype(object)> iUniqueName##subfunc(aUniqueName##subfunc, timeout, object)
161 #undef __useBuiltinFunction__