From 3d2913c67c83cca05a009ebbca3d11a5586d6117 Mon Sep 17 00:00:00 2001 From: Tal Shnaiderman Date: Tue, 16 Mar 2021 15:28:18 +0200 Subject: [PATCH] eal: add error numbers in thread TLS API Add error number reporting to rte_errno in all functions in the rte_thread_tls_* API. Suggested-by: Anatoly Burakov Signed-off-by: Tal Shnaiderman Acked-by: Dmitry Kozlyuk --- lib/librte_eal/include/rte_thread.h | 14 +++++++++++--- lib/librte_eal/unix/rte_thread.c | 6 ++++++ lib/librte_eal/windows/rte_thread.c | 6 ++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h index ac5a89b1ad..ee9232299d 100644 --- a/lib/librte_eal/include/rte_thread.h +++ b/lib/librte_eal/include/rte_thread.h @@ -63,7 +63,9 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp); * * @return * On success, zero. - * On failure, a negative number. + * On failure, a negative number and an error number is set in rte_errno. + * rte_errno can be: ENOMEM - Memory allocation error. + * ENOEXEC - Specific OS error. */ __rte_experimental @@ -77,7 +79,9 @@ int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)); * * @return * On success, zero. - * On failure, a negative number. + * On failure, a negative number and an error number is set in rte_errno. + * rte_errno can be: EINVAL - Invalid parameter passed. + * ENOEXEC - Specific OS error. */ __rte_experimental int rte_thread_tls_key_delete(rte_tls_key key); @@ -92,7 +96,9 @@ int rte_thread_tls_key_delete(rte_tls_key key); * * @return * On success, zero. - * On failure, a negative number. + * On failure, a negative number and an error number is set in rte_errno. + * rte_errno can be: EINVAL - Invalid parameter passed. + * ENOEXEC - Specific OS error. */ __rte_experimental int rte_thread_tls_value_set(rte_tls_key key, const void *value); @@ -106,6 +112,8 @@ int rte_thread_tls_value_set(rte_tls_key key, const void *value); * @return * On success, value data pointer (can also be NULL). * On failure, NULL and an error number is set in rte_errno. + * rte_errno can be: EINVAL - Invalid parameter passed. + * ENOEXEC - Specific OS error. */ __rte_experimental void *rte_thread_tls_value_get(rte_tls_key key); diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c index 86ffeebc95..b187c69a4c 100644 --- a/lib/librte_eal/unix/rte_thread.c +++ b/lib/librte_eal/unix/rte_thread.c @@ -24,6 +24,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)) *key = malloc(sizeof(**key)); if ((*key) == NULL) { RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n"); + rte_errno = ENOMEM; return -1; } err = pthread_key_create(&((*key)->thread_index), destructor); @@ -31,6 +32,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)) RTE_LOG(DEBUG, EAL, "pthread_key_create failed: %s\n", strerror(err)); free(*key); + rte_errno = ENOEXEC; return -1; } return 0; @@ -43,6 +45,7 @@ rte_thread_tls_key_delete(rte_tls_key key) if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } err = pthread_key_delete(key->thread_index); @@ -50,6 +53,7 @@ rte_thread_tls_key_delete(rte_tls_key key) RTE_LOG(DEBUG, EAL, "pthread_key_delete failed: %s\n", strerror(err)); free(key); + rte_errno = ENOEXEC; return -1; } free(key); @@ -63,12 +67,14 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value) if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } err = pthread_setspecific(key->thread_index, value); if (err) { RTE_LOG(DEBUG, EAL, "pthread_setspecific failed: %s\n", strerror(err)); + rte_errno = ENOEXEC; return -1; } return 0; diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c index 2e2ab29177..fa9e360855 100644 --- a/lib/librte_eal/windows/rte_thread.c +++ b/lib/librte_eal/windows/rte_thread.c @@ -18,12 +18,14 @@ rte_thread_tls_key_create(rte_tls_key *key, *key = malloc(sizeof(**key)); if ((*key) == NULL) { RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n"); + rte_errno = ENOMEM; return -1; } (*key)->thread_index = TlsAlloc(); if ((*key)->thread_index == TLS_OUT_OF_INDEXES) { RTE_LOG_WIN32_ERR("TlsAlloc()"); free(*key); + rte_errno = ENOEXEC; return -1; } return 0; @@ -34,11 +36,13 @@ rte_thread_tls_key_delete(rte_tls_key key) { if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } if (!TlsFree(key->thread_index)) { RTE_LOG_WIN32_ERR("TlsFree()"); free(key); + rte_errno = ENOEXEC; return -1; } free(key); @@ -52,12 +56,14 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value) if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } /* discard const qualifier */ p = (char *) (uintptr_t) value; if (!TlsSetValue(key->thread_index, p)) { RTE_LOG_WIN32_ERR("TlsSetValue()"); + rte_errno = ENOEXEC; return -1; } return 0; -- 2.20.1