add error number reporting to rte_errno in all functions in the rte_thread_tls_* API.
Suggested-by: Anatoly Burakov <anatoly.bura...@intel.com> Signed-off-by: Tal Shnaiderman <tal...@nvidia.com> --- lib/librte_eal/include/rte_thread.h | 6 +++--- lib/librte_eal/unix/rte_thread.c | 6 ++++++ lib/librte_eal/windows/rte_thread.c | 8 +++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h index e640ea1857..39737d1829 100644 --- a/lib/librte_eal/include/rte_thread.h +++ b/lib/librte_eal/include/rte_thread.h @@ -59,7 +59,7 @@ 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_experimental @@ -73,7 +73,7 @@ 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_experimental int rte_thread_tls_key_delete(rte_tls_key key); @@ -88,7 +88,7 @@ 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_experimental int rte_thread_tls_value_set(rte_tls_key key, const void *value); diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c index 86ffeebc95..86e42bf653 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 = err; 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 = err; 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 = err; return -1; } return 0; diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c index 2e2ab29177..1c226b3e30 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 = GetLastError(); 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 = GetLastError(); 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 = GetLastError(); return -1; } return 0; @@ -76,7 +82,7 @@ rte_thread_tls_value_get(rte_tls_key key) output = TlsGetValue(key->thread_index); if (GetLastError() != ERROR_SUCCESS) { RTE_LOG_WIN32_ERR("TlsGetValue()"); - rte_errno = ENOEXEC; + rte_errno = GetLastError(); return NULL; } return output; -- 2.16.1.windows.4