Add function to translate Windows error codes to errno-style error
codes. The possible return values are chosen so that we have as
much semantical compatibility between platforms as possible.

Signed-off-by: Narcisa Vasile <navas...@microsoft.com>
Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com>
---
 lib/eal/windows/rte_thread.c | 48 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/lib/eal/windows/rte_thread.c b/lib/eal/windows/rte_thread.c
index 667287c..b3b5362 100644
--- a/lib/eal/windows/rte_thread.c
+++ b/lib/eal/windows/rte_thread.c
@@ -11,6 +11,54 @@ struct eal_tls_key {
        DWORD thread_index;
 };
 
+/* Translates the most common error codes related to threads */
+static int
+thread_translate_win32_error(DWORD error)
+{
+       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;
+       }
+
+       return EINVAL;
+}
+
+static int
+thread_log_last_error(const char *message)
+{
+       DWORD error = GetLastError();
+       RTE_LOG(DEBUG, EAL, "GetLastError()=%lu: %s\n", error, message);
+
+       return thread_translate_win32_error(error);
+}
+
 int
 rte_thread_key_create(rte_thread_key *key,
                __rte_unused void (*destructor)(void *))
-- 
1.8.3.1

Reply via email to