Пример #1
0
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
}
Пример #2
0
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);
}
Пример #3
0
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__);
  }
}
Пример #4
0
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);
  }
}
Пример #5
0
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);
  }
}