Module: sems Branch: rco/dnscache Commit: 2c3875dad89dc0e31d69efcac85798a131002c55 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=2c3875dad89dc0e31d69efcac85798a131002c55
Author: Raphael Coeffic <[email protected]> Committer: Raphael Coeffic <[email protected]> Date: Wed Sep 1 14:18:15 2010 +0200 added a garbage collector threads (removes expired entries) --- core/atomic_types.h | 2 -- core/hash_table.h | 2 ++ core/sip/resolver.cpp | 40 +++++++++++++++++++++++++++++++++++++++- core/sip/resolver.h | 7 +++++-- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/core/atomic_types.h b/core/atomic_types.h index 8ecd1b4..e09055a 100644 --- a/core/atomic_types.h +++ b/core/atomic_types.h @@ -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; } diff --git a/core/hash_table.h b/core/hash_table.h index 5bd1fb6..682d65a 100644 --- a/core/hash_table.h +++ b/core/hash_table.h @@ -228,6 +228,8 @@ public: _table[l]->dump(); } } + + unsigned long get_size() { return size; } }; diff --git a/core/sip/resolver.cpp b/core/sip/resolver.cpp index 16321d0..5ff0e9a 100644 --- a/core/sip/resolver.cpp +++ b/core/sip/resolver.cpp @@ -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++ diff --git a/core/sip/resolver.h b/core/sip/resolver.h index e60d7d2..5c86eeb 100644 --- a/core/sip/resolver.h +++ b/core/sip/resolver.h @@ -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; }; _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
