void ndpi_free_lru_cache(struct ndpi_LruCache *cache) { int i; if(unlikely(traceLRU)) printf("%s()", __FUNCTION__); for(i=0; i<(int)cache->hash_size; i++) { struct ndpi_LruCacheEntry *head = cache->hash[i]; while(head != NULL) { struct ndpi_LruCacheEntry *next = head->next; free_lru_cache_entry(cache, head); ndpi_free(head); #ifdef FULL_STATS cache->mem_size -= sizeof(struct ndpi_LruCacheEntry); #endif head = next; } } ndpi_free(cache->hash); #ifdef FULL_STATS cache->mem_size -= cache->hash_size*sizeof(struct ndpi_LruCacheEntry*); #endif ndpi_free(cache->current_hash_size); #ifdef FULL_STATS cache->mem_size -= cache->hash_size*sizeof(u_int32_t); #endif }
void free_lru_cache(struct LruCache *cache) { int i; if(unlikely(traceLRU)) traceEvent(TRACE_NORMAL, "%s()", __FUNCTION__); for(i=0; i<cache->hash_size; i++) { struct LruCacheEntry *head = cache->hash[i]; while(head != NULL) { struct LruCacheEntry *next = head->next; free_lru_cache_entry(cache, head); free(head); #ifdef FULL_STATS cache->mem_size -= sizeof(struct LruCacheEntry); #endif head = next; } } free(cache->hash); #ifdef FULL_STATS cache->mem_size -= cache->hash_size*sizeof(struct LruCacheEntry*); #endif free(cache->current_hash_size); #ifdef FULL_STATS cache->mem_size -= cache->hash_size*sizeof(u_int32_t); #endif pthread_rwlock_destroy(&cache->lruLock); }
static void trim_subhash(struct ndpi_LruCache *cache, u_int32_t hash_id) { if(unlikely(traceLRU)) printf("%s()", __FUNCTION__); if(cache->current_hash_size[hash_id] >= cache->max_cache_node_len) { struct ndpi_LruCacheEntry *head = cache->hash[hash_id], *prev = NULL; /* Find the last entry and remove it */ while(head->next != NULL) { prev = head; head = head->next; } if(prev) { prev->next = head->next; free_lru_cache_entry(cache, head); ndpi_free(head); #ifdef FULL_STATS cache->mem_size -= sizeof(struct ndpi_LruCacheEntry); #endif cache->current_hash_size[hash_id]--; } else printf("ERROR: Internal error in %s()", __FUNCTION__); } }
char* find_lru_cache_str(struct LruCache *cache, char *key) { if(cache->hash_size == 0) return(0); else { u_int32_t hash_val = hash_string(key); u_int32_t hash_id = hash_val % cache->hash_size; struct LruCacheEntry *head, *prev = NULL; char *ret_val = NULL; if(unlikely(traceLRU)) traceEvent(TRACE_NORMAL, "%s(%s)", __FUNCTION__, key); /* We need wrlock and not rdlock as if an entry is expired we will manipulate the list */ pthread_rwlock_wrlock(&cache->lruLock); // validate_unit_len(cache, hash_id); cache->num_cache_find++; head = cache->hash[hash_id]; while(head != NULL) { if(strcmp(head->u.str.key, key) == 0) { if(head->u.str.expire_time <readWriteGlobals->now) { /* The node has expired */ if(prev == NULL) cache->hash[hash_id] = head->next; else prev->next = head->next; free_lru_cache_entry(cache, head); free(head); #ifdef FULL_STATS cache->mem_size -= sizeof(struct LruCacheEntry); #endif ret_val = NULL; cache->current_hash_size[hash_id]--; } else ret_val = head->u.str.value; break; } else { prev = head; head = head->next; } } if(ret_val == NULL) cache->num_cache_misses++; // validate_unit_len(cache, hash_id); pthread_rwlock_unlock(&cache->lruLock); return(ret_val); } }
char*ndpi_find_lru_cache_str(struct ndpi_LruCache *cache, char *key) { if(cache->hash_size == 0) return(0); else { u_int32_t hash_val = lru_hash_string(key); u_int32_t hash_id = hash_val % cache->hash_size; struct ndpi_LruCacheEntry *head, *prev = NULL; char *ret_val = NULL; time_t now = get_now(); if(unlikely(traceLRU)) printf("%s(%s)", __FUNCTION__, key); // validate_unit_len(cache, hash_id); cache->num_cache_find++; head = cache->hash[hash_id]; while(head != NULL) { if(strcmp(head->u.str.key, key) == 0) { if(head->u.str.expire_time < now) { /* The node has expired */ if(prev == NULL) cache->hash[hash_id] = head->next; else prev->next = head->next; free_lru_cache_entry(cache, head); ndpi_free(head); #ifdef FULL_STATS cache->mem_size -= sizeof(struct ndpi_LruCacheEntry); #endif ret_val = NULL; cache->current_hash_size[hash_id]--; } else ret_val = head->u.str.value; break; } else { prev = head; head = head->next; } } if(ret_val == NULL) cache->num_cache_misses++; // validate_unit_len(cache, hash_id); return(ret_val); } }