From 56539289b8719213008d9309dcdc4888fa342410 Mon Sep 17 00:00:00 2001 From: Tyler Retzlaff Date: Thu, 12 May 2022 06:14:28 -0700 Subject: [PATCH] eal: provide current thread identifier Provide a portable type-safe thread identifier. Provide rte_thread_self for obtaining current thread identifier. Signed-off-by: Narcisa Vasile Signed-off-by: Tyler Retzlaff Acked-by: Dmitry Kozlyuk Acked-by: Konstantin Ananyev --- lib/eal/include/rte_thread.h | 22 ++++++++++++++++++++++ lib/eal/unix/rte_thread.c | 13 +++++++++++++ lib/eal/version.map | 3 +++ lib/eal/windows/rte_thread.c | 10 ++++++++++ 4 files changed, 48 insertions(+) diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h index 8be8ed8f36..14478bae21 100644 --- a/lib/eal/include/rte_thread.h +++ b/lib/eal/include/rte_thread.h @@ -1,7 +1,10 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2021 Mellanox Technologies, Ltd + * Copyright (C) 2022 Microsoft Corporation */ +#include + #include #include @@ -20,11 +23,30 @@ extern "C" { #endif +/** + * Thread id descriptor. + */ +typedef struct { + uintptr_t opaque_id; /**< thread identifier */ +} rte_thread_t; + /** * TLS key type, an opaque pointer. */ typedef struct eal_tls_key *rte_thread_key; +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Get the id of the calling thread. + * + * @return + * Return the thread id of the calling thread. + */ +__rte_experimental +rte_thread_t rte_thread_self(void); + #ifdef RTE_HAS_CPUSET /** diff --git a/lib/eal/unix/rte_thread.c b/lib/eal/unix/rte_thread.c index c34ede9186..5e5beb1cea 100644 --- a/lib/eal/unix/rte_thread.c +++ b/lib/eal/unix/rte_thread.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright 2021 Mellanox Technologies, Ltd + * Copyright (C) 2022 Microsoft Corporation */ #include @@ -15,6 +16,18 @@ struct eal_tls_key { pthread_key_t thread_index; }; +rte_thread_t +rte_thread_self(void) +{ + RTE_BUILD_BUG_ON(sizeof(pthread_t) > sizeof(uintptr_t)); + + rte_thread_t thread_id; + + thread_id.opaque_id = (uintptr_t)pthread_self(); + + return thread_id; +} + int rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *)) { diff --git a/lib/eal/version.map b/lib/eal/version.map index b53eeb30d7..05ce8f9d56 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -420,6 +420,9 @@ EXPERIMENTAL { rte_intr_instance_free; rte_intr_type_get; rte_intr_type_set; + + # added in 22.07 + rte_thread_self; }; INTERNAL { diff --git a/lib/eal/windows/rte_thread.c b/lib/eal/windows/rte_thread.c index 667287c387..59fed3cfbe 100644 --- a/lib/eal/windows/rte_thread.c +++ b/lib/eal/windows/rte_thread.c @@ -11,6 +11,16 @@ struct eal_tls_key { DWORD thread_index; }; +rte_thread_t +rte_thread_self(void) +{ + rte_thread_t thread_id; + + thread_id.opaque_id = GetCurrentThreadId(); + + return thread_id; +} + int rte_thread_key_create(rte_thread_key *key, __rte_unused void (*destructor)(void *)) -- 2.20.1