[ClusterLabs Developers] libqb: Re: 633f262 logging: Remove linker 'magic' and just use statics for logging callsites (#322)
Lars Ellenberg
lars.ellenberg at linbit.com
Wed Jan 16 14:44:22 UTC 2019
Back then when this "dynamic" logging was introduced,
I thought the whole point was that "quiet" callsites
are "cheap".
So I think you want to
qb_log_callsite_get() only *once* per callsite,
assign that to a static pointer (as you say in the commit message).
And do the actual qb_log_real_() function call
only conditionally based on if (cs->targets).
That way, a disabled trace logging boils down to a
if (cs && cs->targets)
;
Much cheaper than what you have now.
Or was always calling into both qb_log_callsite_get() and qb_log_real_()
intentional for some obscure (to me) reason,
even for disabled call sites?
Below I also added a test for (cs->tags & QB_LOG_TAG_LIBQB_MSG),
in case someone used qb_util_set_log_function().
If that special tag flag could be folded into cs->targets (e.g. bit 0),
I'd like it even better.
Cheers,
Lars
diff --git a/include/qb/qblog.h b/include/qb/qblog.h
index 1943b94..f63f4ad 100644
--- a/include/qb/qblog.h
+++ b/include/qb/qblog.h
@@ -485,11 +485,17 @@ void qb_log_from_external_source_va(const char *function,
qb_log_real_(&descriptor, ##args); \
} while(0)
#else
-#define qb_logt(priority, tags, fmt, args...) do { \
- struct qb_log_callsite* descriptor_pt = \
- qb_log_callsite_get(__func__, __FILE__, fmt, \
- priority, __LINE__, tags); \
- qb_log_real_(descriptor_pt, ##args); \
+#define qb_logt(priority, tags, fmt, args...) do { \
+ static struct qb_log_callsite* descriptor_pt; \
+ if (!descriptor_pt) { \
+ descriptor_pt = \
+ qb_log_callsite_get(__func__, __FILE__, fmt, \
+ priority, __LINE__, tags); \
+ } \
+ if (descriptor_pt->targets || \
+ qb_bit_is_set(descriptor_pt->tags, \
+ QB_LOG_TAG_LIBQB_MSG_BIT)) \
+ qb_log_real_(descriptor_pt, ##args); \
} while(0)
#endif /* QB_HAVE_ATTRIBUTE_SECTION */
More information about the Developers
mailing list