> 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.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>
>>>
>>