/* * Copyright (c) 2021 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_SUBSYS_LOGGING_LOG_CACHE_H_ #define ZEPHYR_SUBSYS_LOGGING_LOG_CACHE_H_ #include #ifdef __cplusplus extern "C" { #endif struct log_cache_entry { sys_snode_t node; uintptr_t id; uint8_t data[]; }; typedef bool (*log_cache_cmp_func_t)(uintptr_t id0, uintptr_t id1); struct log_cache_config { void *buf; size_t buf_len; size_t item_size; log_cache_cmp_func_t cmp; }; struct log_cache { sys_slist_t active; sys_slist_t idle; log_cache_cmp_func_t cmp; uint32_t hit; uint32_t miss; size_t item_size; }; int log_cache_init(struct log_cache *cache, const struct log_cache_config *config); /** @brief Get cached entry or buffer to fill new data for caching. * * @param[in] cache Cache object. * @param[in] id Identication. * @param[out] data Location. * * @retval true if entry with given @p id was found and @p data contains pointer to it. * @retval false if entry was not found and @p data points to the empty location. */ bool log_cache_get(struct log_cache *cache, uintptr_t id, uint8_t **data); /** @brief Put new entry into cache. * * @param cache Cache object. * @param data Buffer filled with new data. It must point to the location returned by * @ref log_cache_get. */ void log_cache_put(struct log_cache *cache, uint8_t *data); /** @brief Release entry. * * Release entry that was allocated by @ref log_cache_get when requested id was * not found in the cache. Releasing puts entry in idle list. * * @param cache Cache object. * @param data It must point to the location returned by @ref log_cache_get. */ void log_cache_release(struct log_cache *cache, uint8_t *data); /** @brief Get hit count. * * @param cache Cache object. * * @return Number of hits. */ static inline uint32_t log_cache_get_hit(struct log_cache *cache) { return cache->hit; } /** @brief Get miss count. * * @param cache Cache object. * * @return Number of misses. */ static inline uint32_t log_cache_get_miss(struct log_cache *cache) { return cache->miss; } #ifdef __cplusplus } #endif #endif /* ZEPHYR_SUBSYS_LOGGING_LOG_CACHE_H_ */