Browse Source

Refine cache replacing

pull/953/head
Max Lv 8 years ago
parent
commit
c6876b0707
4 changed files with 22 additions and 16 deletions
  1. 22
      src/acl.c
  2. 10
      src/cache.c
  3. 4
      src/cache.h
  4. 2
      src/udprelay.c

22
src/acl.c

@ -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);
}

10
src/cache.c

@ -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);
}

4
src/cache.h

@ -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);

2
src/udprelay.c

@ -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;

Loading…
Cancel
Save