eal: provide current thread identifier
[dpdk.git] / lib / eal / windows / rte_thread.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2021 Mellanox Technologies, Ltd
3  */
4
5 #include <rte_common.h>
6 #include <rte_errno.h>
7 #include <rte_thread.h>
8 #include <rte_windows.h>
9
10 struct eal_tls_key {
11         DWORD thread_index;
12 };
13
14 rte_thread_t
15 rte_thread_self(void)
16 {
17         rte_thread_t thread_id;
18
19         thread_id.opaque_id = GetCurrentThreadId();
20
21         return thread_id;
22 }
23
24 int
25 rte_thread_key_create(rte_thread_key *key,
26                 __rte_unused void (*destructor)(void *))
27 {
28         *key = malloc(sizeof(**key));
29         if ((*key) == NULL) {
30                 RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n");
31                 rte_errno = ENOMEM;
32                 return -1;
33         }
34         (*key)->thread_index = TlsAlloc();
35         if ((*key)->thread_index == TLS_OUT_OF_INDEXES) {
36                 RTE_LOG_WIN32_ERR("TlsAlloc()");
37                 free(*key);
38                 rte_errno = ENOEXEC;
39                 return -1;
40         }
41         return 0;
42 }
43
44 int
45 rte_thread_key_delete(rte_thread_key key)
46 {
47         if (!key) {
48                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
49                 rte_errno = EINVAL;
50                 return -1;
51         }
52         if (!TlsFree(key->thread_index)) {
53                 RTE_LOG_WIN32_ERR("TlsFree()");
54                 free(key);
55                 rte_errno = ENOEXEC;
56                 return -1;
57         }
58         free(key);
59         return 0;
60 }
61
62 int
63 rte_thread_value_set(rte_thread_key key, const void *value)
64 {
65         char *p;
66
67         if (!key) {
68                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
69                 rte_errno = EINVAL;
70                 return -1;
71         }
72         /* discard const qualifier */
73         p = (char *) (uintptr_t) value;
74         if (!TlsSetValue(key->thread_index, p)) {
75                 RTE_LOG_WIN32_ERR("TlsSetValue()");
76                 rte_errno = ENOEXEC;
77                 return -1;
78         }
79         return 0;
80 }
81
82 void *
83 rte_thread_value_get(rte_thread_key key)
84 {
85         void *output;
86
87         if (!key) {
88                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
89                 rte_errno = EINVAL;
90                 return NULL;
91         }
92         output = TlsGetValue(key->thread_index);
93         if (GetLastError() != ERROR_SUCCESS) {
94                 RTE_LOG_WIN32_ERR("TlsGetValue()");
95                 rte_errno = ENOEXEC;
96                 return NULL;
97         }
98         return output;
99 }