Module: sems
Branch: rco/dnscache
Commit: 4dbeade64e8900e33a27bd4197b6a66a3d87d84f
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=4dbeade64e8900e33a27bd4197b6a66a3d87d84f

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

Reply via email to