23/01/2023 20:39, Tyler Retzlaff: > Add a rte_thread_set_name that sets the name of an rte_thread_t thread. > This is a replacement for the rte_thread_setname(pthread_t, ...) which > exposes platform-specific details. > > Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com> > > Acked-by: Morten Brørup <m...@smartsharesystems.com> > > --- > lib/eal/common/eal_common_thread.c | 8 ++----- > lib/eal/freebsd/eal.c | 3 +-- > lib/eal/freebsd/eal_thread.c | 11 ++++++++++ > lib/eal/include/rte_thread.h | 17 +++++++++++++++ > lib/eal/linux/eal.c | 6 +----- > lib/eal/linux/eal_thread.c | 22 +++++++++++++++++++ > lib/eal/version.map | 3 +++ > lib/eal/windows/rte_thread.c | 43 > ++++++++++++++++++++++++++++++++++++++ > 8 files changed, 100 insertions(+), 13 deletions(-) > > diff --git a/lib/eal/common/eal_common_thread.c > b/lib/eal/common/eal_common_thread.c > index 38d83a6..3181515 100644 > --- a/lib/eal/common/eal_common_thread.c > +++ b/lib/eal/common/eal_common_thread.c > @@ -288,12 +288,8 @@ static void *ctrl_thread_init(void *arg) > return -ret; > } > > - if (name != NULL) { > - ret = rte_thread_setname(*thread, name); > - if (ret < 0) > - RTE_LOG(DEBUG, EAL, > - "Cannot set name for ctrl thread\n"); > - } > + if (name != NULL) > + rte_thread_set_name((rte_thread_t){(uintptr_t)*thread}, name); > > /* Wait for the control thread to initialize successfully */ > while ((ctrl_thread_status = > diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c > index 8db5007..9303401 100644 > --- a/lib/eal/freebsd/eal.c > +++ b/lib/eal/freebsd/eal.c > @@ -817,8 +817,7 @@ static void rte_eal_init_alert(const char *msg) > /* Set thread_name for aid in debugging. */ > snprintf(thread_name, sizeof(thread_name), > "rte-worker-%d", i); > - > rte_thread_setname((pthread_t)lcore_config[i].thread_id.opaque_id, > - thread_name); > + rte_thread_set_name(lcore_config[i].thread_id, thread_name); > > ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id, > &lcore_config[i].cpuset); > diff --git a/lib/eal/freebsd/eal_thread.c b/lib/eal/freebsd/eal_thread.c > index ab81b52..b69f5d3 100644 > --- a/lib/eal/freebsd/eal_thread.c > +++ b/lib/eal/freebsd/eal_thread.c > @@ -32,6 +32,17 @@ int rte_sys_gettid(void) > return (int)lwpid; > } > > +void rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) > +{ > + char truncated[RTE_MAX_THREAD_NAME_LEN]; > + const size_t truncatedsz = sizeof(truncated); > + > + if (strlcpy(truncated, thread_name, truncatedsz) >= truncatedsz) > + RTE_LOG(DEBUG, EAL, "Truncated thread name\n"); > + > + pthread_set_name_np((pthread_t)thread_id.opaque_id, truncated); > +} > + > int rte_thread_setname(pthread_t id, const char *name) > { > /* this BSD function returns no error */ > diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h > index b9edf70..8a63a52 100644 > --- a/lib/eal/include/rte_thread.h > +++ b/lib/eal/include/rte_thread.h > @@ -146,6 +146,23 @@ int rte_thread_create(rte_thread_t *thread_id, > * @warning > * @b EXPERIMENTAL: this API may change without prior notice. > * > + * Set the name of the thread.
We need to explain that it can fail. > + * > + * @param thread_id > + * The id of the thread to set name. > + * > + * @param thread_name > + * The name to set. Truncated to RTE_MAX_THREAD_NAME_LEN, > + * including terminating NUL if necessary. > + */ > +__rte_experimental > +void > +rte_thread_set_name(rte_thread_t thread_id, const char *thread_name); [...] > --- a/lib/eal/linux/eal_thread.c > +++ b/lib/eal/linux/eal_thread.c > +void rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) > +{ > + int ret = ENOSYS; > +#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) > +#if __GLIBC_PREREQ(2, 12) > + char truncated[RTE_MAX_THREAD_NAME_LEN]; > + const size_t truncatedsz = sizeof(truncated); > + > + if (strlcpy(truncated, thread_name, truncatedsz) >= truncatedsz) > + RTE_LOG(DEBUG, EAL, "Truncated thread name\n"); > + > + ret = pthread_setname_np((pthread_t)thread_id.opaque_id, truncated); > +#endif > +#endif > + RTE_SET_USED(thread_id); > + RTE_SET_USED(thread_name); > + > + if (ret != 0) > + RTE_LOG(DEBUG, EAL, "Failed to set thread name\n"); > +} It is very close to rte_thread_setname with few differences. OK > --- a/lib/eal/windows/rte_thread.c > +++ b/lib/eal/windows/rte_thread.c > +void > +rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) > +{ > + int ret = 0; > + wchar_t wname[RTE_MAX_THREAD_NAME_LEN]; > + mbstate_t state = {0}; > + size_t rv; > + HANDLE thread_handle; > + > + thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, > + thread_id.opaque_id); > + if (thread_handle == NULL) { > + ret = thread_log_last_error("OpenThread()"); > + goto cleanup; > + } > + > + memset(wname, 0, sizeof(wname)); > + rv = mbsrtowcs(wname, &thread_name, RTE_DIM(wname) - 1, &state); > + if (rv == (size_t)-1) { > + ret = EILSEQ; > + goto cleanup; > + } > + > +#ifndef RTE_TOOLCHAIN_GCC > + if (FAILED(SetThreadDescription(thread_handle, wname))) { > + ret = EINVAL; > + goto cleanup; > + } > +#else > + ret = ENOTSUP; > + goto cleanup; > +#endif > + > +cleanup: > + if (thread_handle != NULL) > + CloseHandle(thread_handle); > + > + if (ret != 0) > + RTE_LOG(DEBUG, EAL, "Failed to set thread name\n"); > +} This is a new function for Windows, right? It should be noted in the commit log.