lib: remove librte_ prefix from directory names
[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_common.h>
11 #include <rte_errno.h>
12 #include <rte_log.h>
13 #include <rte_thread.h>
14
15 struct eal_tls_key {
16         pthread_key_t thread_index;
17 };
18
19 int
20 rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))
21 {
22         int err;
23
24         *key = malloc(sizeof(**key));
25         if ((*key) == NULL) {
26                 RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n");
27                 rte_errno = ENOMEM;
28                 return -1;
29         }
30         err = pthread_key_create(&((*key)->thread_index), destructor);
31         if (err) {
32                 RTE_LOG(DEBUG, EAL, "pthread_key_create failed: %s\n",
33                          strerror(err));
34                 free(*key);
35                 rte_errno = ENOEXEC;
36                 return -1;
37         }
38         return 0;
39 }
40
41 int
42 rte_thread_key_delete(rte_thread_key key)
43 {
44         int err;
45
46         if (!key) {
47                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
48                 rte_errno = EINVAL;
49                 return -1;
50         }
51         err = pthread_key_delete(key->thread_index);
52         if (err) {
53                 RTE_LOG(DEBUG, EAL, "pthread_key_delete failed: %s\n",
54                          strerror(err));
55                 free(key);
56                 rte_errno = ENOEXEC;
57                 return -1;
58         }
59         free(key);
60         return 0;
61 }
62
63 int
64 rte_thread_value_set(rte_thread_key key, const void *value)
65 {
66         int err;
67
68         if (!key) {
69                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
70                 rte_errno = EINVAL;
71                 return -1;
72         }
73         err = pthread_setspecific(key->thread_index, value);
74         if (err) {
75                 RTE_LOG(DEBUG, EAL, "pthread_setspecific failed: %s\n",
76                         strerror(err));
77                 rte_errno = ENOEXEC;
78                 return -1;
79         }
80         return 0;
81 }
82
83 void *
84 rte_thread_value_get(rte_thread_key key)
85 {
86         if (!key) {
87                 RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
88                 rte_errno = EINVAL;
89                 return NULL;
90         }
91         return pthread_getspecific(key->thread_index);
92 }