| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "thread-cache.h" |
| 4 | |
| 5 | static __thread Pvoid_t thread_cache_judy_array = NULL; |
| 6 | |
| 7 | void *thread_cache_entry_get_or_set(void *key, |
| 8 | ssize_t key_length, |
| 9 | void *value, |
| 10 | void *(*transform_the_value_before_insert)(void *key, size_t key_length, void *value) |
| 11 | ) { |
| 12 | if(unlikely(!key || !key_length)) return NULL; |
| 13 | |
| 14 | if(key_length == -1) |
| 15 | key_length = (ssize_t)strlen((char *)key); |
| 16 | |
| 17 | JError_t J_Error; |
| 18 | Pvoid_t *Rc = JudyHSIns(&thread_cache_judy_array, key, key_length, &J_Error); |
| 19 | if (unlikely(Rc == PJERR)) { |
| 20 | fatal("THREAD_CACHE: Cannot insert entry to JudyHS, JU_ERRNO_* == %u, ID == %d", |
| 21 | JU_ERRNO(&J_Error), JU_ERRID(&J_Error)); |
| 22 | } |
| 23 | |
| 24 | if(*Rc == 0) { |
| 25 | // new item added |
| 26 | |
| 27 | *Rc = (transform_the_value_before_insert) ? transform_the_value_before_insert(key, key_length, value) : value; |
| 28 | } |
| 29 | |
| 30 | return *Rc; |
| 31 | } |
| 32 | |
| 33 | void thread_cache_destroy(void) { |
| 34 | if(unlikely(!thread_cache_judy_array)) return; |
| 35 | |
| 36 | JError_t J_Error; |
| 37 | Word_t ret = JudyHSFreeArray(&thread_cache_judy_array, &J_Error); |
| 38 | if(unlikely(ret == (Word_t) JERR)) { |
| 39 | netdata_log_error("THREAD_CACHE: Cannot destroy JudyHS, JU_ERRNO_* == %u, ID == %d", |
| 40 | JU_ERRNO(&J_Error), JU_ERRID(&J_Error)); |
| 41 | } |
| 42 | |
| 43 | internal_error(true, "THREAD_CACHE: hash table freed %lu bytes", ret); |
| 44 | |
| 45 | thread_cache_judy_array = NULL; |
| 46 | } |
| 47 |