|
@@ -39,7 +39,9 @@ struct dns_cache_head {
|
|
struct hash_table cache_hash;
|
|
struct hash_table cache_hash;
|
|
struct list_head cache_list;
|
|
struct list_head cache_list;
|
|
atomic_t num;
|
|
atomic_t num;
|
|
|
|
+ atomic_t mem_size;
|
|
int size;
|
|
int size;
|
|
|
|
+ long max_mem_size;
|
|
pthread_mutex_t lock;
|
|
pthread_mutex_t lock;
|
|
dns_cache_callback timeout_callback;
|
|
dns_cache_callback timeout_callback;
|
|
};
|
|
};
|
|
@@ -49,7 +51,7 @@ typedef int (*dns_cache_read_callback)(struct dns_cache_record *cache_record, st
|
|
static int is_cache_init;
|
|
static int is_cache_init;
|
|
static struct dns_cache_head dns_cache_head;
|
|
static struct dns_cache_head dns_cache_head;
|
|
|
|
|
|
-int dns_cache_init(int size, dns_cache_callback timeout_callback)
|
|
|
|
|
|
+int dns_cache_init(int size, int mem_size, dns_cache_callback timeout_callback)
|
|
{
|
|
{
|
|
int bits = 0;
|
|
int bits = 0;
|
|
pthread_mutexattr_t mta;
|
|
pthread_mutexattr_t mta;
|
|
@@ -68,7 +70,12 @@ int dns_cache_init(int size, dns_cache_callback timeout_callback)
|
|
|
|
|
|
hash_table_init(dns_cache_head.cache_hash, bits, malloc);
|
|
hash_table_init(dns_cache_head.cache_hash, bits, malloc);
|
|
atomic_set(&dns_cache_head.num, 0);
|
|
atomic_set(&dns_cache_head.num, 0);
|
|
|
|
+ atomic_set(&dns_cache_head.mem_size, 0);
|
|
dns_cache_head.size = size;
|
|
dns_cache_head.size = size;
|
|
|
|
+ dns_cache_head.max_mem_size = mem_size;
|
|
|
|
+ if (mem_size > 0) {
|
|
|
|
+ dns_cache_head.size = INT32_MAX;
|
|
|
|
+ }
|
|
dns_cache_head.timeout_callback = timeout_callback;
|
|
dns_cache_head.timeout_callback = timeout_callback;
|
|
pthread_mutexattr_init(&mta);
|
|
pthread_mutexattr_init(&mta);
|
|
pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);
|
|
pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);
|
|
@@ -91,6 +98,7 @@ static void _dns_cache_delete(struct dns_cache *dns_cache)
|
|
list_del_init(&dns_cache->list);
|
|
list_del_init(&dns_cache->list);
|
|
pthread_mutex_unlock(&dns_cache_head.lock);
|
|
pthread_mutex_unlock(&dns_cache_head.lock);
|
|
atomic_dec(&dns_cache_head.num);
|
|
atomic_dec(&dns_cache_head.num);
|
|
|
|
+ atomic_sub(sizeof(*dns_cache), &dns_cache_head.mem_size);
|
|
if (dns_cache->cache_data) {
|
|
if (dns_cache->cache_data) {
|
|
dns_cache_data_put(dns_cache->cache_data);
|
|
dns_cache_data_put(dns_cache->cache_data);
|
|
}
|
|
}
|
|
@@ -158,6 +166,7 @@ struct dns_cache_data *dns_cache_new_data_packet(void *packet, size_t packet_len
|
|
cache_packet->head.size = packet_len;
|
|
cache_packet->head.size = packet_len;
|
|
cache_packet->head.magic = MAGIC_CACHE_DATA;
|
|
cache_packet->head.magic = MAGIC_CACHE_DATA;
|
|
atomic_set(&cache_packet->head.ref, 1);
|
|
atomic_set(&cache_packet->head.ref, 1);
|
|
|
|
+ atomic_add(data_size, &dns_cache_head.mem_size);
|
|
|
|
|
|
return (struct dns_cache_data *)cache_packet;
|
|
return (struct dns_cache_data *)cache_packet;
|
|
}
|
|
}
|
|
@@ -314,6 +323,7 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
|
|
}
|
|
}
|
|
|
|
|
|
memset(dns_cache, 0, sizeof(*dns_cache));
|
|
memset(dns_cache, 0, sizeof(*dns_cache));
|
|
|
|
+ atomic_add(sizeof(*dns_cache), &dns_cache_head.mem_size);
|
|
key = hash_string(info->domain);
|
|
key = hash_string(info->domain);
|
|
key = jhash(&info->qtype, sizeof(info->qtype), key);
|
|
key = jhash(&info->qtype, sizeof(info->qtype), key);
|
|
key = hash_string_initval(info->dns_group_name, key);
|
|
key = hash_string_initval(info->dns_group_name, key);
|
|
@@ -333,7 +343,8 @@ static int _dns_cache_insert(struct dns_cache_info *info, struct dns_cache_data
|
|
list_add_tail(&dns_cache->list, head);
|
|
list_add_tail(&dns_cache->list, head);
|
|
|
|
|
|
/* Release extra cache, remove oldest cache record */
|
|
/* Release extra cache, remove oldest cache record */
|
|
- if (atomic_inc_return(&dns_cache_head.num) > dns_cache_head.size) {
|
|
|
|
|
|
+ if (atomic_inc_return(&dns_cache_head.num) > dns_cache_head.size ||
|
|
|
|
+ (dns_cache_head.max_mem_size > 0 && atomic_read(&dns_cache_head.mem_size) > dns_cache_head.max_mem_size)) {
|
|
struct dns_cache *del_cache = NULL;
|
|
struct dns_cache *del_cache = NULL;
|
|
del_cache = _dns_cache_first();
|
|
del_cache = _dns_cache_first();
|
|
if (del_cache) {
|
|
if (del_cache) {
|
|
@@ -519,6 +530,7 @@ void dns_cache_data_put(struct dns_cache_data *cache_data)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ atomic_sub(cache_data->head.size + sizeof(*cache_data), &dns_cache_head.mem_size);
|
|
free(cache_data);
|
|
free(cache_data);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -532,6 +544,11 @@ int dns_cache_total_num(void)
|
|
return atomic_read(&dns_cache_head.num);
|
|
return atomic_read(&dns_cache_head.num);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+long dns_cache_total_memsize(void)
|
|
|
|
+{
|
|
|
|
+ return atomic_read(&dns_cache_head.mem_size);
|
|
|
|
+}
|
|
|
|
+
|
|
void dns_cache_delete(struct dns_cache *dns_cache)
|
|
void dns_cache_delete(struct dns_cache *dns_cache)
|
|
{
|
|
{
|
|
pthread_mutex_lock(&dns_cache_head.lock);
|
|
pthread_mutex_lock(&dns_cache_head.lock);
|