When I've done debug tags like this in the past, it ended up like a simpler version of records.config. IE
bool your_tag = false; register_tag("your_tag_name", &your_tag); //store a map<string,pointer> can be referenced by name. if (your_tag) printf(...); // direct access, no derefences or indirection with additiona API void set_tag_by_name(string const &name, bool value); bool get_tag_by_name(string const &name); ^ it can be templated to handle more than bools if you like I'm not sure if this better performance than Walt+Alan's suggestion, but just another style. On Thu, Apr 4, 2019 at 9:18 AM Leif Hedstrom <zw...@apache.org> wrote: > > > > On Apr 4, 2019, at 8:05 AM, Walt Karas <wka...@verizonmedia.com.INVALID> > wrote: > > > > Because senility. probably "on" should be a non-pointer of type const > > volatile char, and InkAPI in the core can just keep a pointer to the > whole > > structure for updating. > > > > But I'm leaning more to fixing up the capability that already kinda > there. > > Which is optimizimg only for the case when all debug output is disabled. > > Especially since maybe zwoop would be on my side for once :o) . > > > My bad, whatever Walt said, I take the opposite stance. > > — leif > > P.s > J/K! > > > > > On Thu, Apr 4, 2019 at 8:51 AM Alan Carroll > > <solidwallofc...@verizonmedia.com.invalid> wrote: > > > >> This could enable a significant speed up for debug tags. One point is > that > >> when the debug tag string is set, at that point the debug objects could > be > >> updated to the correct state according to the debug tag string, rather > than > >> checking it every time a debug message is logged. > >> > >> I have to ask, why is there a pointer to the enable flag, instead of > just > >> the enable flag? Your logic doesn't even check that flag, it checks > whether > >> the pointer is null. > >> > >> On Wed, Apr 3, 2019 at 11:52 AM Leif Hedstrom <zw...@apache.org> wrote: > >> > >>> > >>> > >>>> On Apr 3, 2019, at 10:47 AM, Walt Karas <wka...@verizonmedia.com > >> .INVALID> > >>> wrote: > >>>> > >>>> 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) > >>> > >>> Yeh, that kinda sounds like a bug, doesn’t it? > >>> > >>>> > >>>> 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. > >>> > >>> Right, we should always optimize for the common cases, obviously. When > >>> there’s a decision to make, where you can either make it “equally” > >>> expensive always, or more expensive in a rare case, but cheaper in the > >>> common case, we should likely chose the latter. > >>> > >>> > >>> > >>>> > >>>> 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. > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>> > >>> > >> > >