From: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> Convert the `tr2tls_thread_ctx.thread_name` field from a `strbuf` to a "flex array" at the end of the context structure. The `thread_name` field is a constant string that is constructed when the context is created. Using a (non-const) `strbuf` structure for it caused some confusion in the past because it implied that someone could rename a thread after it was created. That usage was not intended. Changing it to a "flex array" will hopefully make the intent more clear. Also, move the maximum thread_name truncation to tr2_tgt_perf.c because it is the only target that needs to worry about output column alignment. Signed-off-by: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> --- trace2/tr2_tgt_event.c | 2 +- trace2/tr2_tgt_perf.c | 8 ++++++-- trace2/tr2_tls.c | 25 +++++++++++++------------ trace2/tr2_tls.h | 9 +-------- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/trace2/tr2_tgt_event.c b/trace2/tr2_tgt_event.c index 37a3163be12..52f9356c695 100644 --- a/trace2/tr2_tgt_event.c +++ b/trace2/tr2_tgt_event.c @@ -90,7 +90,7 @@ static void event_fmt_prepare(const char *event_name, const char *file, jw_object_string(jw, "event", event_name); jw_object_string(jw, "sid", tr2_sid_get()); - jw_object_string(jw, "thread", ctx->thread_name.buf); + jw_object_string(jw, "thread", ctx->thread_name); /* * In brief mode, only emit <time> on these 2 event types. diff --git a/trace2/tr2_tgt_perf.c b/trace2/tr2_tgt_perf.c index 8cb792488c8..fdeb3292d3a 100644 --- a/trace2/tr2_tgt_perf.c +++ b/trace2/tr2_tgt_perf.c @@ -25,6 +25,7 @@ static int tr2env_perf_be_brief; #define TR2FMT_PERF_FL_WIDTH (28) #define TR2FMT_PERF_MAX_EVENT_NAME (12) +#define TR2FMT_PERF_MAX_THREAD_NAME (24) #define TR2FMT_PERF_REPO_WIDTH (3) #define TR2FMT_PERF_CATEGORY_WIDTH (12) @@ -107,8 +108,11 @@ static void perf_fmt_prepare(const char *event_name, } strbuf_addf(buf, "d%d | ", tr2_sid_depth()); - strbuf_addf(buf, "%-*s | %-*s | ", TR2_MAX_THREAD_NAME, - ctx->thread_name.buf, TR2FMT_PERF_MAX_EVENT_NAME, + strbuf_addf(buf, "%-*.*s | %-*s | ", + TR2FMT_PERF_MAX_THREAD_NAME, + TR2FMT_PERF_MAX_THREAD_NAME, + ctx->thread_name, + TR2FMT_PERF_MAX_EVENT_NAME, event_name); len = buf->len + TR2FMT_PERF_REPO_WIDTH; diff --git a/trace2/tr2_tls.c b/trace2/tr2_tls.c index 39b41fd2487..89437e773f6 100644 --- a/trace2/tr2_tls.c +++ b/trace2/tr2_tls.c @@ -34,7 +34,18 @@ void tr2tls_start_process_clock(void) struct tr2tls_thread_ctx *tr2tls_create_self(const char *name_hint, uint64_t us_thread_start) { - struct tr2tls_thread_ctx *ctx = xcalloc(1, sizeof(*ctx)); + struct tr2tls_thread_ctx *ctx; + struct strbuf buf_name = STRBUF_INIT; + int thread_id = tr2tls_locked_increment(&tr2_next_thread_id); + + if (thread_id) + strbuf_addf(&buf_name, "th%02d:", thread_id); + strbuf_addstr(&buf_name, name_hint); + + FLEX_ALLOC_MEM(ctx, thread_name, buf_name.buf, buf_name.len); + strbuf_release(&buf_name); + + ctx->thread_id = thread_id; /* * Implicitly "tr2tls_push_self()" to capture the thread's start @@ -45,15 +56,6 @@ struct tr2tls_thread_ctx *tr2tls_create_self(const char *name_hint, ctx->array_us_start = (uint64_t *)xcalloc(ctx->alloc, sizeof(uint64_t)); ctx->array_us_start[ctx->nr_open_regions++] = us_thread_start; - ctx->thread_id = tr2tls_locked_increment(&tr2_next_thread_id); - - strbuf_init(&ctx->thread_name, 0); - if (ctx->thread_id) - strbuf_addf(&ctx->thread_name, "th%02d:", ctx->thread_id); - strbuf_addstr(&ctx->thread_name, name_hint); - if (ctx->thread_name.len > TR2_MAX_THREAD_NAME) - strbuf_setlen(&ctx->thread_name, TR2_MAX_THREAD_NAME); - pthread_setspecific(tr2tls_key, ctx); return ctx; @@ -95,7 +97,6 @@ void tr2tls_unset_self(void) pthread_setspecific(tr2tls_key, NULL); - strbuf_release(&ctx->thread_name); free(ctx->array_us_start); free(ctx); } @@ -113,7 +114,7 @@ void tr2tls_pop_self(void) struct tr2tls_thread_ctx *ctx = tr2tls_get_self(); if (!ctx->nr_open_regions) - BUG("no open regions in thread '%s'", ctx->thread_name.buf); + BUG("no open regions in thread '%s'", ctx->thread_name); ctx->nr_open_regions--; } diff --git a/trace2/tr2_tls.h b/trace2/tr2_tls.h index f1ee58305d6..be0bc73d08f 100644 --- a/trace2/tr2_tls.h +++ b/trace2/tr2_tls.h @@ -9,17 +9,12 @@ * There is NO relation to "transport layer security". */ -/* - * Arbitry limit for thread names for column alignment. - */ -#define TR2_MAX_THREAD_NAME (24) - struct tr2tls_thread_ctx { - struct strbuf thread_name; uint64_t *array_us_start; size_t alloc; size_t nr_open_regions; /* plays role of "nr" in ALLOC_GROW */ int thread_id; + char thread_name[FLEX_ARRAY]; }; /* @@ -32,8 +27,6 @@ struct tr2tls_thread_ctx { * upon the name of the thread-proc function). For example: * { .thread_id=10, .thread_name="th10fsm-listen" } * This helps to identify and distinguish messages from concurrent threads. - * The ctx.thread_name field is truncated if necessary to help with column - * alignment in printf-style messages. * * In this and all following functions the term "self" refers to the * current thread. -- gitgitgadget