* fix for #3402 * fixed unsupported type
This commit is contained in:
@@ -48,13 +48,6 @@ static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_
|
||||
/** remove an item and push it to the free items queue */
|
||||
static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index);
|
||||
|
||||
/**
|
||||
* remove the least recently used item
|
||||
*
|
||||
* @todo we can optimise this by finding the n lru items, where n = required_space / average_length
|
||||
*/
|
||||
static void lv_lru_remove_lru_item(lv_lru_t * cache);
|
||||
|
||||
/** pop an existing item off the free queue, or create a new one */
|
||||
static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache);
|
||||
|
||||
@@ -152,7 +145,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
|
||||
|
||||
// see if the key already exists
|
||||
uint32_t hash_index = lv_lru_hash(cache, key, key_length);
|
||||
size_t required = 0;
|
||||
int required = 0;
|
||||
lv_lru_item_t * item = NULL, *prev = NULL;
|
||||
item = cache->items[hash_index];
|
||||
|
||||
@@ -163,7 +156,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
|
||||
|
||||
if(item) {
|
||||
// update the value and value_lengths
|
||||
required = (size_t)(value_length - item->value_length);
|
||||
required = (int)(value_length - item->value_length);
|
||||
cache->value_free(item->value);
|
||||
item->value = value;
|
||||
item->value_length = value_length;
|
||||
@@ -177,7 +170,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
|
||||
memcpy(item->key, key, key_length);
|
||||
item->value_length = value_length;
|
||||
item->key_length = key_length;
|
||||
required = (size_t) value_length;
|
||||
required = (int) value_length;
|
||||
|
||||
if(prev)
|
||||
prev->next = item;
|
||||
@@ -241,6 +234,34 @@ lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size)
|
||||
return LV_LRU_OK;
|
||||
}
|
||||
|
||||
void lv_lru_remove_lru_item(lv_lru_t * cache)
|
||||
{
|
||||
lv_lru_item_t * min_item = NULL, *min_prev = NULL;
|
||||
lv_lru_item_t * item = NULL, *prev = NULL;
|
||||
uint32_t i = 0, min_index = -1;
|
||||
uint64_t min_access_count = -1;
|
||||
|
||||
for(; i < cache->hash_table_size; i++) {
|
||||
item = cache->items[i];
|
||||
prev = NULL;
|
||||
|
||||
while(item) {
|
||||
if(item->access_count < min_access_count || (int64_t) min_access_count == -1) {
|
||||
min_access_count = item->access_count;
|
||||
min_item = item;
|
||||
min_prev = prev;
|
||||
min_index = i;
|
||||
}
|
||||
prev = item;
|
||||
item = item->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(min_item) {
|
||||
lv_lru_remove_item(cache, min_prev, min_item, min_index);
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
@@ -282,18 +303,22 @@ static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_len
|
||||
|
||||
static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length)
|
||||
{
|
||||
if(key_length != item->key_length)
|
||||
if(key_length != item->key_length) {
|
||||
return 1;
|
||||
else
|
||||
}
|
||||
else {
|
||||
return memcmp(key, item->key, key_length);
|
||||
}
|
||||
}
|
||||
|
||||
static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index)
|
||||
{
|
||||
if(prev)
|
||||
if(prev) {
|
||||
prev->next = item->next;
|
||||
else
|
||||
}
|
||||
else {
|
||||
cache->items[hash_index] = (lv_lru_item_t *) item->next;
|
||||
}
|
||||
|
||||
// free memory and update the free memory counter
|
||||
cache->free_memory += item->value_length;
|
||||
@@ -306,33 +331,6 @@ static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_it
|
||||
cache->free_items = item;
|
||||
}
|
||||
|
||||
static void lv_lru_remove_lru_item(lv_lru_t * cache)
|
||||
{
|
||||
lv_lru_item_t * min_item = NULL, *min_prev = NULL;
|
||||
lv_lru_item_t * item = NULL, *prev = NULL;
|
||||
uint32_t i = 0, min_index = -1;
|
||||
uint64_t min_access_count = -1;
|
||||
|
||||
for(; i < cache->hash_table_size; i++) {
|
||||
item = cache->items[i];
|
||||
prev = NULL;
|
||||
|
||||
while(item) {
|
||||
if(item->access_count < min_access_count || (int64_t) min_access_count == -1) {
|
||||
min_access_count = item->access_count;
|
||||
min_item = item;
|
||||
min_prev = prev;
|
||||
min_index = i;
|
||||
}
|
||||
prev = item;
|
||||
item = item->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(min_item)
|
||||
lv_lru_remove_item(cache, min_prev, min_item, min_index);
|
||||
}
|
||||
|
||||
static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache)
|
||||
{
|
||||
lv_lru_item_t * item = NULL;
|
||||
|
||||
@@ -71,6 +71,12 @@ lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, voi
|
||||
|
||||
lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size);
|
||||
|
||||
/**
|
||||
* remove the least recently used item
|
||||
*
|
||||
* @todo we can optimise this by finding the n lru items, where n = required_space / average_length
|
||||
*/
|
||||
void lv_lru_remove_lru_item(lv_lru_t * cache);
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
Reference in New Issue
Block a user