On Tue, Dec 28 2021, Jeff Hostetler via GitGitGadget wrote: > From: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> > > Teach the message formatter in the Trace2 perf target to accept an > optional thread name argument. This will override the thread name > inherited from the thread local storage data block. > > This will be used in a future commit for global events that should > not be tied to a particular thread, such as a global stopwatch timer. We already have a "ctx", and that "ctx" has a "thread_name", but here and in the preceding commit we're adding a "thread_name" to every caller of these functions in case we'd like to override it. Wouldn't it make more sense to just pass a "ctx" to these functions? One of them already takes it, here's an (obviously incomplete) fixup on top of your series to make the one that doesn't take a "ctx", and for the only non-NULL users of "thread_name" to just use a trivial helper to pass in a "ctx" with a new "thread_name", then to swap it back. It would make for a smaller diffstat for this already large series, or we could do exactly what we're doing now, but avoid the churn of adjusting every caller by introducing a new sister function for those who want this parameter to be non-NULL. (The below patch is "broken" in that __FILE__ and __LINE__ need to be passed in as parameters, but this is just a trivial change for show/commentary) diff --git a/trace2/tr2_tgt_event.c b/trace2/tr2_tgt_event.c index b9eb2cdb77a..7aaec83dff7 100644 --- a/trace2/tr2_tgt_event.c +++ b/trace2/tr2_tgt_event.c @@ -82,16 +82,15 @@ static void fn_term(void) static void event_fmt_prepare(const char *event_name, const char *file, int line, const struct repository *repo, struct json_writer *jw, - const char *thread_name_override) + struct tr2tls_thread_ctx *ctx) { struct tr2_tbuf tb_now; + if (!ctx) + ctx = tr2tls_get_self(); jw_object_string(jw, "event", event_name); jw_object_string(jw, "sid", tr2_sid_get()); - jw_object_string(jw, "thread", - ((thread_name_override && *thread_name_override) - ? thread_name_override - : tr2tls_get_self()->thread_name)); + jw_object_string(jw, "thread", ctx->thread_name); /* * In brief mode, only emit <time> on these 2 event types. @@ -111,6 +110,20 @@ static void event_fmt_prepare(const char *event_name, const char *file, jw_object_intmax(jw, "repo", repo->trace2_repo_id); } +static void event_fmt_prepare_tn(const char *event_name, const char *file, + int line, const struct repository *repo, + struct json_writer *jw, + const char *thread_name) +{ + struct tr2tls_thread_ctx *ctx = tr2tls_get_self(); + const char *tmp; + + tmp = ctx->thread_name; + ctx->thread_name = thread_name; + event_fmt_prepare(event_name, __FILE__, __LINE__, NULL, jw, ctx); + ctx->thread_name = tmp; +} + static void fn_too_many_files_fl(const char *file, int line) { const char *event_name = "too_many_files"; @@ -629,7 +642,7 @@ static void fn_timer(uint64_t us_elapsed_absolute, double t_abs = (double)us_elapsed_absolute / 1000000.0; jw_object_begin(&jw, 0); - event_fmt_prepare(event_name, __FILE__, __LINE__, NULL, &jw, thread_name); + event_fmt_prepare_tn(event_name, __FILE__, __LINE__, NULL, &jw, thread_name); jw_object_double(&jw, "t_abs", 6, t_abs); jw_object_string(&jw, "name", timer_name); jw_object_intmax(&jw, "count", interval_count); @@ -654,7 +667,7 @@ static void fn_counter(uint64_t us_elapsed_absolute, double t_abs = (double)us_elapsed_absolute / 1000000.0; jw_object_begin(&jw, 0); - event_fmt_prepare(event_name, __FILE__, __LINE__, NULL, &jw, thread_name); + event_fmt_prepare_tn(event_name, __FILE__, __LINE__, NULL, &jw, thread_name); jw_object_double(&jw, "t_abs", 6, t_abs); jw_object_string(&jw, "name", counter_name); jw_object_intmax(&jw, "value", value);