xref: /dpdk/lib/eal/unix/rte_thread.c (revision 3b78aa7b2317fb385ed7fa5f5535f60050ede618)
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 }
92