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