[dpdk-dev] [PATCH v5 03/10] windows/eal: translate Windows errors to errno-style errors

Tal Shnaiderman talshn at nvidia.com
Wed Mar 31 15:56:09 CEST 2021


> Subject: [PATCH v5 03/10] windows/eal: translate Windows errors to errno-
> style errors
> 
> External email: Use caution opening links or attachments
> 
> 
> From: Narcisa Vasile <navasile at microsoft.com>
> 
> Add function to translate Windows error codes to errno-style error codes.
> 
> Signed-off-by: Narcisa Vasile <navasile at microsoft.com>
> ---
>  lib/librte_eal/windows/rte_thread.c | 65 ++++++++++++++++++++++-------
>  1 file changed, 50 insertions(+), 15 deletions(-)
> 
> diff --git a/lib/librte_eal/windows/rte_thread.c
> b/lib/librte_eal/windows/rte_thread.c
> index b29336cbd..e9181b47f 100644
> --- a/lib/librte_eal/windows/rte_thread.c
> +++ b/lib/librte_eal/windows/rte_thread.c
> @@ -12,6 +12,47 @@ struct eal_tls_key {
>         DWORD thread_index;
>  };
> 
> +/* Translates the most common error codes related to threads */ static
> +int rte_thread_translate_win32_error(DWORD error) {

This DWORD error will always the output of GetLastError()? If so can we move it inside the function?

Also, I don't think this is a thread specific function, other implementations can use it in the future, maybe move it to rte_windows.h? 

> +       switch (error) {
> +       case ERROR_SUCCESS:
> +               return 0;
> +
> +       case ERROR_INVALID_PARAMETER:
> +               return EINVAL;
> +
> +       case ERROR_INVALID_HANDLE:
> +               return EFAULT;
> +
> +       case ERROR_NOT_ENOUGH_MEMORY:
> +       /* FALLTHROUGH */
> +       case ERROR_NO_SYSTEM_RESOURCES:
> +               return ENOMEM;
> +
> +       case ERROR_PRIVILEGE_NOT_HELD:
> +       /* FALLTHROUGH */
> +       case ERROR_ACCESS_DENIED:
> +               return EACCES;
> +
> +       case ERROR_ALREADY_EXISTS:
> +               return EEXIST;
> +
> +       case ERROR_POSSIBLE_DEADLOCK:
> +               return EDEADLK;
> +
> +       case ERROR_INVALID_FUNCTION:
> +       /* FALLTHROUGH */
> +       case ERROR_CALL_NOT_IMPLEMENTED:
> +               return ENOSYS;
> +
> +       default:
> +               return EINVAL;
> +       }
> +
> +       return EINVAL;
> +}
> +
>  rte_thread_t
>  rte_thread_self(void)
>  {
> @@ -87,15 +128,13 @@ rte_thread_key_create(rte_thread_key *key,
>         *key = malloc(sizeof(**key));
>         if ((*key) == NULL) {
>                 RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n");
> -               rte_errno = ENOMEM;
> -               return -1;
> +               return ENOMEM;
>         }
>         (*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 rte_thread_translate_win32_error(GetLastError());
>         }
>         return 0;
>  }
> @@ -103,16 +142,14 @@ rte_thread_key_create(rte_thread_key *key,  int
> rte_thread_key_delete(rte_thread_key key)  {
> -       if (!key) {
> +       if (key == NULL) {
>                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
> -               rte_errno = EINVAL;
> -               return -1;
> +               return EINVAL;
>         }
>         if (!TlsFree(key->thread_index)) {
>                 RTE_LOG_WIN32_ERR("TlsFree()");
>                 free(key);
> -               rte_errno = ENOEXEC;
> -               return -1;
> +               return rte_thread_translate_win32_error(GetLastError());
>         }
>         free(key);
>         return 0;
> @@ -123,17 +160,15 @@ rte_thread_value_set(rte_thread_key key, const
> void *value)  {
>         char *p;
> 
> -       if (!key) {
> +       if (key == NULL) {
>                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
> -               rte_errno = EINVAL;
> -               return -1;
> +               return EINVAL;
>         }
>         /* 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 rte_thread_translate_win32_error(GetLastError());
>         }
>         return 0;
>  }
> @@ -143,7 +178,7 @@ rte_thread_value_get(rte_thread_key key)  {
>         void *output;
> 

This function is missing the change to rte_thread_translate_win32_error.
Aldo need to change function docu.

> -       if (!key) {
> +       if (key == NULL) {
>                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
>                 rte_errno = EINVAL;
>                 return NULL;
> --
> 2.30.0.vfs.0.2



More information about the dev mailing list