added a garbage collector threads (removes expired entries)

sayer/1.4-spce2.6
Raphael Coeffic 16 years ago
parent 0672c66d8e
commit 2c3875dad8

@ -122,13 +122,11 @@ inline void inc_ref(atomic_ref_cnt* rc)
{
assert(rc);
rc->inc();
//DBG("after inc_ref(%p): ref_cnt = %u",rc,rc->get());
}
inline void dec_ref(atomic_ref_cnt* rc)
{
assert(rc);
//DBG("before dec_ref(%p): ref_cnt = %u",rc,rc->get());
if(rc->dec_and_test())
delete rc;
}

@ -228,6 +228,8 @@ public:
_table[l]->dump();
}
}
unsigned long get_size() { return size; }
};

@ -266,7 +266,7 @@ dns_entry* dns_bucket::find(const string& name)
_resolver::_resolver()
: cache(DNS_CACHE_SIZE)
{
start();
}
_resolver::~_resolver()
@ -604,6 +604,44 @@ int dns_handle::next_ip(sockaddr_storage* sa)
return ip_e->next_ip(this,sa);
}
void _resolver::run()
{
for(;;) {
sleep(10);
timeval tv_now;
gettimeofday(&tv_now,NULL);
DBG("starting DNS cache garbage collection");
for(unsigned long i=0; i<cache.get_size(); i++){
dns_bucket* bucket = cache.get_bucket(i);
bucket->lock();
for(dns_bucket::value_map::iterator it = bucket->elmts.begin();
it != bucket->elmts.end(); ++it){
dns_entry* dns_e = (dns_entry*)it->second;
if(tv_now.tv_sec >= it->second->expire){
dns_bucket::value_map::iterator tmp_it = it;
bool end_of_bucket = (++it == bucket->elmts.end());
DBG("########### expiring record %p #############",dns_e);
bucket->elmts.erase(tmp_it);
dec_ref(dns_e);
if(end_of_bucket) break;
}
else {
DBG("######### record %p expires in %li seconds ##########",dns_e,it->second->expire-tv_now.tv_sec);
}
}
bucket->unlock();
}
}
}
/** EMACS **
* Local variables:
* mode: c++

@ -84,6 +84,7 @@ typedef ht_map_bucket<string,dns_entry> dns_bucket_base;
class dns_bucket
: protected dns_bucket_base
{
friend class _resolver;
public:
dns_bucket(unsigned long id);
bool insert(const string& name, dns_entry* e);
@ -106,8 +107,6 @@ struct dns_handle
int next_ip(sockaddr_storage* sa);
//void operator = (const dns_handle& h);
private:
friend class _resolver;
friend class dns_entry;
@ -123,6 +122,7 @@ private:
};
class _resolver
: AmThread
{
public:
int resolve_name(const char* name,
@ -142,6 +142,9 @@ protected:
sockaddr_storage* sa,
const address_type types);
void run();
void on_stop() {}
private:
dns_cache cache;
};

Loading…
Cancel
Save