From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id F29BEA04B5; Sun, 13 Dec 2020 21:02:11 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0C1EBC968; Sun, 13 Dec 2020 21:02:10 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id E32D854AE for ; Sun, 13 Dec 2020 21:02:06 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from talshn@nvidia.com) with SMTP; 13 Dec 2020 22:02:04 +0200 Received: from nvidia.com (l-wincomp04-vm.mtl.labs.mlnx [10.237.1.5]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0BDK24On024915; Sun, 13 Dec 2020 22:02:04 +0200 From: Tal Shnaiderman To: dev@dpdk.org Cc: thomas@monjalon.net, pallavi.kadam@intel.com, dmitry.kozliuk@gmail.com, navasile@linux.microsoft.com, dmitrym@microsoft.com Date: Sun, 13 Dec 2020 22:00:15 +0200 Message-Id: <20201213200015.5932-1-talshn@nvidia.com> X-Mailer: git-send-email 2.16.1.windows.4 Subject: [dpdk-dev] [PATCH] eal/windows: add pthread TLS function support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add the following functions to the pthread shim implementation for Windows as they are needed for thread safe rte_flow functions. pthread_key_create. pthread_key_delete. pthread_getspecific. pthread_setspecific. Signed-off-by: Tal Shnaiderman --- lib/librte_eal/windows/include/pthread.h | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/librte_eal/windows/include/pthread.h b/lib/librte_eal/windows/include/pthread.h index fb11a07ce6..e0c08fe5d6 100644 --- a/lib/librte_eal/windows/include/pthread.h +++ b/lib/librte_eal/windows/include/pthread.h @@ -34,6 +34,8 @@ typedef CRITICAL_SECTION pthread_mutex_t; typedef SYNCHRONIZATION_BARRIER pthread_barrier_t; +typedef DWORD pthread_key_t; + #define pthread_barrier_init(barrier, attr, count) \ InitializeSynchronizationBarrier(barrier, count, -1) #define pthread_barrier_wait(barrier) EnterSynchronizationBarrier(barrier, \ @@ -179,6 +181,46 @@ pthread_mutex_destroy(pthread_mutex_t *mutex) return 0; } +static inline int +pthread_key_create(pthread_key_t *key, + __rte_unused void (*destructor)(void*)) +{ + if (((*key) = TlsAlloc()) == TLS_OUT_OF_INDEXES) { + RTE_LOG_WIN32_ERR("TlsAlloc()"); + return ENOMEM; + } + return 0; +} + +static inline int +pthread_key_delete(pthread_key_t key) +{ + if (!TlsFree(key)) { + RTE_LOG_WIN32_ERR("TlsFree()"); + return -1; + } + return 0; +} + +static inline void * +pthread_getspecific(pthread_key_t key) +{ + return TlsGetValue(key); +} + +static inline int +pthread_setspecific(pthread_key_t key, const void *value) +{ + /* discard const qualifier */ + char *p = (char *) (uintptr_t) value; + + if (!TlsSetValue(key, p)) { + RTE_LOG_WIN32_ERR("TlsSetValue()"); + return -1; + } + return 0; +} + #ifdef __cplusplus } #endif -- 2.16.1.windows.4