mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-22 06:53:46 +00:00
Refine cache replacing
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user