xref: /dpdk/lib/eal/unix/rte_thread.c (revision 9c30a6f3c9a456e8111a2b1e5f6c2c02a62025b6)
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 }
93