Refine cache replacing

This commit is contained in:
Max Lv
2016-11-15 13:44:47 +08:00
parent 62aec1e280
commit c6876b0707
4 changed files with 22 additions and 16 deletions
+14 -8
View File
@@ -130,7 +130,7 @@ init_firewall()
if (pclose(fp) == 0) {
mode = FIREWALLD_MODE;
} else {
/* Check whether we have permission to operate iptables.
/* Check whether we have permission to operate iptables.
* Note that checking `iptables --version` is insufficient:
* eg, running within a child user namespace.
*/
@@ -223,6 +223,16 @@ set_firewall_rule(char *addr, int add)
return 0;
}
static void
free_firewall_rule(void *key, void *element)
{
if (key == NULL)
return;
char *addr = (char *)key;
set_firewall_rule(addr, 0);
ss_free(element);
}
#endif
void
@@ -231,8 +241,10 @@ init_block_list()
// Initialize cache
#ifdef __linux__
init_firewall();
#endif
cache_create(&block_list, 256, free_firewall_rule);
#else
cache_create(&block_list, 256, NULL);
#endif
}
void
@@ -248,12 +260,6 @@ int
remove_from_block_list(char *addr)
{
size_t addr_len = strlen(addr);
#ifdef __linux__
if (cache_key_exist(block_list, addr, addr_len))
set_firewall_rule(addr, 0);
#endif
return cache_remove(block_list, addr, addr_len);
}
+5 -5
View File
@@ -47,7 +47,7 @@
*/
int
cache_create(struct cache **dst, const size_t capacity,
void (*free_cb)(void *element))
void (*free_cb)(void *key, void *element))
{
struct cache *new = NULL;
@@ -92,7 +92,7 @@ cache_delete(struct cache *cache, int keep_data)
HASH_DEL(cache->entries, entry);
if (entry->data != NULL) {
if (cache->free_cb) {
cache->free_cb(entry->data);
cache->free_cb(entry->key, entry->data);
} else {
ss_free(entry->data);
}
@@ -132,7 +132,7 @@ cache_clear(struct cache *cache, ev_tstamp age)
HASH_DEL(cache->entries, entry);
if (entry->data != NULL) {
if (cache->free_cb) {
cache->free_cb(entry->data);
cache->free_cb(entry->key, entry->data);
} else {
ss_free(entry->data);
}
@@ -173,7 +173,7 @@ cache_remove(struct cache *cache, char *key, size_t key_len)
HASH_DEL(cache->entries, tmp);
if (tmp->data != NULL) {
if (cache->free_cb) {
cache->free_cb(tmp->data);
cache->free_cb(tmp->key, tmp->data);
} else {
ss_free(tmp->data);
}
@@ -291,7 +291,7 @@ cache_insert(struct cache *cache, char *key, size_t key_len, void *data)
HASH_DELETE(hh, cache->entries, entry);
if (entry->data != NULL) {
if (cache->free_cb) {
cache->free_cb(entry->data);
cache->free_cb(entry->key, entry->data);
} else {
ss_free(entry->data);
}
+2 -2
View File
@@ -47,11 +47,11 @@ struct cache_entry {
struct cache {
size_t max_entries; /**<Amount of entries this cache object can hold */
struct cache_entry *entries; /**<Head pointer for uthash */
void (*free_cb) (void *element); /**<Callback function to free cache entries */
void (*free_cb) (void *key, void *element); /**<Callback function to free cache entries */
};
int cache_create(struct cache **dst, const size_t capacity,
void (*free_cb)(void *element));
void (*free_cb)(void *key, void *element));
int cache_delete(struct cache *cache, int keep_data);
int cache_clear(struct cache *cache, ev_tstamp age);
int cache_lookup(struct cache *cache, char *key, size_t key_len, void *result);
+1 -1
View File
@@ -1297,7 +1297,7 @@ CLEAN_UP:
}
void
free_cb(void *element)
free_cb(void *key, void *element)
{
remote_ctx_t *remote_ctx = (remote_ctx_t *)element;