A too-late re-roll of the v2[1], sorry. But this should address all issues raised the last time around. Since v2 I've: * Improved the documentation of the now onnly-macros. I opted to just quote the argument list of the old C functions for explanation. * Some miscellanious commit message grammar fixes. * Whitespace fixes in 2/3. * There's a new 3/3 which removes an indirection used to define __FILE__, instead we now use __FILE__ directly. 1. https://lore.kernel.org/git/cover-v2-0.2-00000000000-20220128T110330Z-avarab@xxxxxxxxx/ Ævar Arnfjörð Bjarmason (3): git-compat-util.h: clarify GCC v.s. C99-specific in comment C99: remove hardcoded-out !HAVE_VARIADIC_MACROS code trace.h: remove never-used TRACE_CONTEXT Documentation/CodingGuidelines | 3 + banned.h | 5 -- git-compat-util.h | 16 +--- trace.c | 80 +----------------- trace.h | 145 ++++++++++++++------------------- trace2.c | 39 --------- trace2.h | 25 ------ usage.c | 15 +--- 8 files changed, 67 insertions(+), 261 deletions(-) Range-diff against v2: 1: 31079a71ecb = 1: 1a15fe4fd74 git-compat-util.h: clarify GCC v.s. C99-specific in comment 2: 966d96505cb ! 2: bd0f969be55 C99: remove hardcoded-out !HAVE_VARIADIC_MACROS code @@ Commit message C99: remove hardcoded-out !HAVE_VARIADIC_MACROS code Remove the "else" branches of the HAVE_VARIADIC_MACROS macro, which - has been unconditionally omitted since 765dc168882 (git-compat-util: + have been unconditionally omitted since 765dc168882 (git-compat-util: always enable variadic macros, 2021-01-28). - Since they were hardcoded out anyone trying to compile a version of + Since were always omitted, anyone trying to use a compiler without + variadic macro support to compile a git since version git v2.31.0 or later would have had a compilation error. 10 months across a few releases since then should have been enough time for anyone who cared to run into that and report the issue. @@ trace.h: void trace_command_performance(const char **argv); - */ -void trace_strbuf(struct trace_key *key, const struct strbuf *data); - - /** +-/** - * Prints elapsed time (in nanoseconds) if GIT_TRACE_PERFORMANCE is enabled. -+ * Macros to add the file:line of the calling code, instead of that of -+ * the trace function itself. - * +- * - * Example: - * ------------ - * uint64_t t = 0; @@ trace.h: void trace_command_performance(const char **argv); - * should be used. - */ - + /* + * TRACE_CONTEXT may be set to __FUNCTION__ if the compiler supports it. The + * default is __FILE__, as it is consistent with assert(), and static function +@@ trace.h: void trace_performance_leave(const char *format, ...); + # define TRACE_CONTEXT __FILE__ + #endif + -/* -- * TRACE_CONTEXT may be set to __FUNCTION__ if the compiler supports it. The -- * default is __FILE__, as it is consistent with assert(), and static function -- * names are not necessarily unique. -- * -- * __FILE__ ":" __FUNCTION__ doesn't work with GNUC, as __FILE__ is supplied -- * by the preprocessor as a string literal, and __FUNCTION__ is filled in by -- * the compiler as a string constant. -- */ --#ifndef TRACE_CONTEXT --# define TRACE_CONTEXT __FILE__ --#endif -- --/* ++/** ++ * Macros to add the file:line of the calling code, instead of that of ++ * the trace function itself. ++ * * Note: with C99 variadic macros, __VA_ARGS__ must include the last fixed * parameter ('format' in this case). Otherwise, a call without variable * arguments will have a surplus ','. E.g.: @@ trace.h: void trace_performance_leave(const char *format, ...); - * - * which is invalid (note the ',)'). With GNUC, '##__VA_ARGS__' drops the * comma, but this is non-standard. + */ + ++/** ++ * trace_printf(), accepts "const char *format, ...". + * -+ * TRACE_CONTEXT may be set to __FUNCTION__ if the compiler supports it. The -+ * default is __FILE__, as it is consistent with assert(), and static function -+ * names are not necessarily unique. -+ * -+ * __FILE__ ":" __FUNCTION__ doesn't work with GNUC, as __FILE__ is supplied -+ * by the preprocessor as a string literal, and __FUNCTION__ is filled in by -+ * the compiler as a string constant. ++ * Prints a formatted message, similar to printf. + */ -+#ifndef TRACE_CONTEXT -+# define TRACE_CONTEXT __FILE__ -+#endif ++#define trace_printf(...) trace_printf_key(&trace_default_key, __VA_ARGS__) + +/** -+ * Prints a formatted message, similar to printf. - */ -+#define trace_printf(...) trace_printf_key(&trace_default_key, __VA_ARGS__) - ++ * trace_printf_key(), accepts "struct trace_key *key, const char *format, ...". ++ */ #define trace_printf_key(key, ...) \ do { \ + if (trace_pass_fl(key)) \ @@ trace.h: void trace_performance_leave(const char *format, ...); __VA_ARGS__); \ } while (0) @@ trace.h: void trace_performance_leave(const char *format, ...); -#define trace_printf(...) trace_printf_key(&trace_default_key, __VA_ARGS__) - +/** ++ * trace_argv_printf(), accepts "struct trace_key *key, const char *format, ...)". ++ * + * Prints a formatted message, followed by a quoted list of arguments. + */ #define trace_argv_printf(argv, ...) \ @@ trace.h: void trace_performance_leave(const char *format, ...); } while (0) +/** ++ * trace_strbuf(), accepts "struct trace_key *key, const struct strbuf *data". ++ * + * Prints the strbuf, without additional formatting (i.e. doesn't + * choke on `%` or even `\0`). + */ @@ trace.h: void trace_performance_leave(const char *format, ...); } while (0) +/** ++ * trace_performance(), accepts "uint64_t nanos, const char *format, ...". ++ * + * Prints elapsed time (in nanoseconds) if GIT_TRACE_PERFORMANCE is enabled. + * + * Example: @@ trace.h: void trace_performance_leave(const char *format, ...); } while (0) +/** ++ * trace_performance_since(), accepts "uint64_t start, const char *format, ...". ++ * + * Prints elapsed time since 'start' if GIT_TRACE_PERFORMANCE is enabled. + * + * Example: @@ trace.h: void trace_performance_leave(const char *format, ...); do { \ if (trace_pass_fl(&trace_perf_key)) \ @@ trace.h: void trace_performance_leave(const char *format, ...); - __VA_ARGS__); \ + __VA_ARGS__); \ } while (0) -+ - /* backend functions, use non-*fl macros instead */ - __attribute__((format (printf, 4, 5))) - void trace_printf_key_fl(const char *file, int line, struct trace_key *key, ++/** ++ * trace_performance_leave(), accepts "const char *format, ...". ++ */ + #define trace_performance_leave(...) \ + do { \ + if (trace_pass_fl(&trace_perf_key)) \ @@ trace.h: static inline int trace_pass_fl(struct trace_key *key) return key->fd || !key->initialized; } -: ----------- > 3: 27ea260bbea trace.h: remove never-used TRACE_CONTEXT -- 2.35.1.1129.g03fd99ecb8d