It looks like the TS API already has less granular version of this: extern int diags_on_for_plugins;
#define TSDEBUG \ if (diags_on_for_plugins) \ TSDebug A problem with this is if you write: if (flag) TSDEBUG(yadayada); else do_something(); then the else will be associated with the if hidden in the macro. I'd prefer to change to something like: extern const volatile char TS_detail_dbg_output_enabled; #define TSFastDbg(_TAG, ...) \ do { \ if (TS_detail_dbg_output_enabled) \ TSDebug(_TAG, __VA_ARGS__); \ } while(0) The negative is that we'd only see the benefit when all debug output was disabled. But, in any case, that is the main benefit, to avoid impacts during normal operation. Looking in src/tscore/Diags.cc, it looks like the debug enable flag is only set at startup time. So we wouldn't be able to enable TSFastDbg using traffic_cntl without adding complexity. On Tue, Apr 2, 2019 at 5:48 PM Walt Karas <wka...@verizonmedia.com> wrote: > Add this new structure to apidefs.h: > > typedef struct TSFastDbgCntl_ > { > const char * const tag; // nul-terminated string > const volatile char * const on; // pointer to 1-byte flag > } > TSFastDbgCntl; > > Add this new API function, that returns a pointer to an instance of the > above structure: > > TSFastDbgCntl * TSCreateFastDbgCntl(const char *tag); > > Add this macro, which would be used in place of direct use of TSDebug(). > > #define TSFastDbg(_FD_CNTL, ...) \ > do { \ > if ((_FD_CNTL)->on) \ > TSDebug((_FD_CNTL)->tag, __VA_ARGS__); \ > } while(0) > > The first parameter to TSFastDbg() is a pointer that was returned by > TSCreateFastDbgCntl(). The remaining parameters are printf parameters > (format string and values matching format specifiers). The core would be > responsible for changing the value of the 'on' fields in the TSFastDbgCntl > instances. For direct calls to TSDebug(), even if the tag is disabled, all > the parameters have to be prepared and pushed onto the stack. As was > discussed in IRC, you have to feel guilty about doing converting a > string_view to a string and outputting it with c_str(). Because the code > to do this will be executed even if the debug tag is disabled. > Furthermore, for each call to TSDebug, it's necessary to do an associative > lookup on the tag string to determine that output for the tag is disabled. > > We would want to put equivalent capabilities in Diags.h in the core for > debug output. The implementation is non-trivial, but I think it would take > at most a week including the Au test additions. > > I looked at making TSFastDbg() an inline function rather than a macro: > https://godbolt.org/z/IfVbBk > The opitimization works well if you compile the code with the inline > function as C, but the optimization is poor if you compile it as C++. This > difference exists for both gcc and clang. It's weird. > > > > > >