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