You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
9.0 KiB
C
305 lines
9.0 KiB
C
/*
|
|
ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio.
|
|
|
|
This file is part of ChibiOS.
|
|
|
|
ChibiOS is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ChibiOS is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* @file oslib/include/chobjcaches.h
|
|
* @brief Objects Caches macros and structures.
|
|
*
|
|
* @addtogroup oslib_objchaches
|
|
* @{
|
|
*/
|
|
|
|
#ifndef CHOBJCACHES_H
|
|
#define CHOBJCACHES_H
|
|
|
|
#if (CH_CFG_USE_OBJ_CACHES == TRUE) || defined(__DOXYGEN__)
|
|
|
|
/*===========================================================================*/
|
|
/* Module constants. */
|
|
/*===========================================================================*/
|
|
|
|
/**
|
|
* @name Cached objects flags
|
|
* @{
|
|
*/
|
|
#define OC_FLAG_INLRU 0x00000001U
|
|
#define OC_FLAG_INHASH 0x00000002U
|
|
#define OC_FLAG_SHARED 0x00000004U
|
|
#define OC_FLAG_NOTSYNC 0x00000008U
|
|
#define OC_FLAG_LAZYWRITE 0x00000010U
|
|
#define OC_FLAG_FORGET 0x00000020U
|
|
/** @} */
|
|
|
|
/*===========================================================================*/
|
|
/* Module pre-compile time settings. */
|
|
/*===========================================================================*/
|
|
|
|
/*===========================================================================*/
|
|
/* Derived constants and error checks. */
|
|
/*===========================================================================*/
|
|
|
|
/*===========================================================================*/
|
|
/* Module data structures and types. */
|
|
/*===========================================================================*/
|
|
|
|
/**
|
|
* @brief Flags of cached objects.
|
|
*/
|
|
typedef uint32_t oc_flags_t;
|
|
|
|
/**
|
|
* @brief Type of an hash element header.
|
|
*/
|
|
typedef struct ch_oc_hash_header oc_hash_header_t;
|
|
|
|
/**
|
|
* @brief Type of an LRU element header.
|
|
*/
|
|
typedef struct ch_oc_lru_header oc_lru_header_t;
|
|
|
|
/**
|
|
* @brief Type of a cached object.
|
|
*/
|
|
typedef struct ch_oc_object oc_object_t;
|
|
|
|
/**
|
|
* @brief Type of a cache object.
|
|
*/
|
|
typedef struct ch_objects_cache objects_cache_t;
|
|
|
|
/**
|
|
* @brief Object read function.
|
|
*
|
|
* @param[in] ocp pointer to the @p objects_cache_t structure
|
|
* @param[in] async requests an asynchronous operation if supported, the
|
|
* function is then responsible for releasing the
|
|
* object
|
|
*/
|
|
typedef bool (*oc_readf_t)(objects_cache_t *ocp,
|
|
oc_object_t *objp,
|
|
bool async);
|
|
|
|
/**
|
|
* @brief Object write function.
|
|
*
|
|
* @param[in] ocp pointer to the @p objects_cache_t structure
|
|
* @param[in] async requests an asynchronous operation if supported, the
|
|
* function is then responsible for releasing the
|
|
* object
|
|
*/
|
|
typedef bool (*oc_writef_t)(objects_cache_t *ocp,
|
|
oc_object_t *objp,
|
|
bool async);
|
|
|
|
/**
|
|
* @brief Structure representing an hash table element.
|
|
*/
|
|
struct ch_oc_hash_header {
|
|
/**
|
|
* @brief Next in the collisions list.
|
|
*/
|
|
oc_object_t *hash_next;
|
|
/**
|
|
* @brief Previous in the collisions list.
|
|
*/
|
|
oc_object_t *hash_prev;
|
|
};
|
|
|
|
/**
|
|
* @brief Structure representing an hash table element.
|
|
*/
|
|
struct ch_oc_lru_header {
|
|
/**
|
|
* @brief Next in the collisions list.
|
|
*/
|
|
oc_object_t *hash_next;
|
|
/**
|
|
* @brief Previous in the collisions list.
|
|
*/
|
|
oc_object_t *hash_prev;
|
|
/**
|
|
* @brief Next in the LRU list.
|
|
*/
|
|
oc_object_t *lru_next;
|
|
/**
|
|
* @brief Previous in the LRU list.
|
|
*/
|
|
oc_object_t *lru_prev;
|
|
};
|
|
|
|
/**
|
|
* @brief Structure representing a cached object.
|
|
*/
|
|
struct ch_oc_object {
|
|
/**
|
|
* @brief Next in the collisions list.
|
|
*/
|
|
oc_object_t *hash_next;
|
|
/**
|
|
* @brief Previous in the collisions list.
|
|
*/
|
|
oc_object_t *hash_prev;
|
|
/**
|
|
* @brief Next in the LRU list.
|
|
*/
|
|
oc_object_t *lru_next;
|
|
/**
|
|
* @brief Previous in the LRU list.
|
|
*/
|
|
oc_object_t *lru_prev;
|
|
/**
|
|
* @brief Object group.
|
|
*/
|
|
uint32_t obj_group;
|
|
/**
|
|
* @brief Object key.
|
|
*/
|
|
uint32_t obj_key;
|
|
/**
|
|
* @brief Semaphore for object access.
|
|
*/
|
|
semaphore_t obj_sem;
|
|
/**
|
|
* @brief Object flags.
|
|
*/
|
|
oc_flags_t obj_flags;
|
|
/**
|
|
* @brief User pointer.
|
|
* @note This pointer can be used to refer to external buffers,
|
|
* @p chCacheObjectInit() initializes it to @p NULL.
|
|
*/
|
|
void *dptr;
|
|
};
|
|
|
|
/**
|
|
* @brief Structure representing a cache object.
|
|
*/
|
|
struct ch_objects_cache {
|
|
/**
|
|
* @brief Number of elements in the hash table.
|
|
*/
|
|
ucnt_t hashn;
|
|
/**
|
|
* @brief Pointer to the hash table.
|
|
*/
|
|
oc_hash_header_t *hashp;
|
|
/**
|
|
* @brief Number of elements in the objects table.
|
|
*/
|
|
ucnt_t objn;
|
|
/**
|
|
* @brief Size of elements in the objects table.
|
|
*/
|
|
size_t objsz;
|
|
/**
|
|
* @brief Pointer to the objects table.
|
|
*/
|
|
void *objvp;
|
|
/**
|
|
* @brief LRU list header.
|
|
*/
|
|
oc_lru_header_t lru;
|
|
/**
|
|
* @brief Semaphore for cache access.
|
|
*/
|
|
semaphore_t cache_sem;
|
|
/**
|
|
* @brief Semaphore for LRU access.
|
|
*/
|
|
semaphore_t lru_sem;
|
|
/**
|
|
* @brief Reader functions for cached objects.
|
|
*/
|
|
oc_readf_t readf;
|
|
/**
|
|
* @brief Writer functions for cached objects.
|
|
*/
|
|
oc_writef_t writef;
|
|
};
|
|
|
|
/*===========================================================================*/
|
|
/* Module macros. */
|
|
/*===========================================================================*/
|
|
|
|
/*===========================================================================*/
|
|
/* External declarations. */
|
|
/*===========================================================================*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
void chCacheObjectInit(objects_cache_t *ocp,
|
|
ucnt_t hashn,
|
|
oc_hash_header_t *hashp,
|
|
ucnt_t objn,
|
|
size_t objsz,
|
|
void *objvp,
|
|
oc_readf_t readf,
|
|
oc_writef_t writef);
|
|
oc_object_t *chCacheGetObject(objects_cache_t *ocp,
|
|
uint32_t group,
|
|
uint32_t key);
|
|
void chCacheReleaseObjectI(objects_cache_t *ocp,
|
|
oc_object_t *objp);
|
|
bool chCacheReadObject(objects_cache_t *ocp,
|
|
oc_object_t *objp,
|
|
bool async);
|
|
bool chCacheWriteObject(objects_cache_t *ocp,
|
|
oc_object_t *objp,
|
|
bool async);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/*===========================================================================*/
|
|
/* Module inline functions. */
|
|
/*===========================================================================*/
|
|
|
|
/**
|
|
* @brief Releases an object into the cache.
|
|
* @note This function gives a meaning to the following flags:
|
|
* - @p OC_FLAG_INLRU must be cleared.
|
|
* - @p OC_FLAG_INHASH must be set.
|
|
* - @p OC_FLAG_SHARED must be cleared.
|
|
* - @p OC_FLAG_NOTSYNC invalidates the object and queues it on
|
|
* the LRU tail.
|
|
* - @p OC_FLAG_LAZYWRITE is ignored and kept, a write will occur
|
|
* when the object is removed from the LRU list (lazy write).
|
|
* .
|
|
*
|
|
* @param[in] ocp pointer to the @p objects_cache_t structure
|
|
* @param[in] objp pointer to the @p oc_object_t structure
|
|
*
|
|
* @api
|
|
*/
|
|
static inline void chCacheReleaseObject(objects_cache_t *ocp,
|
|
oc_object_t *objp) {
|
|
|
|
chSysLock();
|
|
chCacheReleaseObjectI(ocp, objp);
|
|
chSchRescheduleS();
|
|
chSysUnlock();
|
|
}
|
|
|
|
#endif /* CH_CFG_USE_OBJ_CACHES == TRUE */
|
|
|
|
#endif /* CHOBJCACHES_H */
|
|
|
|
/** @} */
|