test/mem: disable ASan when accessing unallocated memory
[dpdk.git] / lib / eal / unix / rte_thread.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2021 Mellanox Technologies, Ltd
3  */
4
5 #include <errno.h>
6 #include <pthread.h>
7 #include <stdlib.h>
8 #include <string.h>
9
10 #include <rte_errno.h>
11 #include <rte_log.h>
12 #include <rte_thread.h>
13
14 struct eal_tls_key {
15         pthread_key_t thread_index;
16 };
17
18 int
19 rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))
20 {
21         int err;
22
23         *key = malloc(sizeof(**key));
24         if ((*key) == NULL) {
25                 RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n");
26                 rte_errno = ENOMEM;
27                 return -1;
28         }
29         err = pthread_key_create(&((*key)->thread_index), destructor);
30         if (err) {
31                 RTE_LOG(DEBUG, EAL, "pthread_key_create failed: %s\n",
32                          strerror(err));
33                 free(*key);
34                 rte_errno = ENOEXEC;
35                 return -1;
36         }
37         return 0;
38 }
39
40 int
41 rte_thread_key_delete(rte_thread_key key)
42 {
43         int err;
44
45         if (!key) {
46                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
47                 rte_errno = EINVAL;
48                 return -1;
49         }
50         err = pthread_key_delete(key->thread_index);
51         if (err) {
52                 RTE_LOG(DEBUG, EAL, "pthread_key_delete failed: %s\n",
53                          strerror(err));
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         int err;
66
67         if (!key) {
68                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
69                 rte_errno = EINVAL;
70                 return -1;
71         }
72         err = pthread_setspecific(key->thread_index, value);
73         if (err) {
74                 RTE_LOG(DEBUG, EAL, "pthread_setspecific failed: %s\n",
75                         strerror(err));
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         if (!key) {
86                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
87                 rte_errno = EINVAL;
88                 return NULL;
89         }
90         return pthread_getspecific(key->thread_index);
91 }