]> git.tdb.fi Git - netvis.git/commitdiff
Prevent crashing if the Resolver jams
authorMikko Rasa <tdb@tdb.fi>
Sun, 22 Nov 2009 21:40:35 +0000 (21:40 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 22 Nov 2009 21:40:35 +0000 (21:40 +0000)
source/netvis.cpp
source/resolver.cpp
source/resolver.h

index 3aff9cd48ef210a3f543a8e2adc2e5f258773ed9..dce083706470e17b1600765d4a94ac9a415c433f 100644 (file)
@@ -141,6 +141,7 @@ void NetVis::tick()
                }
                else if(i->second->get_activity()<del_limit)
                {
+                       resolver->cancel(i->second);
                        delete i->second;
                        disabled_hosts.erase(i++);
                }
index d8dc41d81f989ca6a973a1321b348a8eb6d6aeb5..702ce9670d59100d649a47dd29a7df060dd557b2 100644 (file)
@@ -34,6 +34,24 @@ void Resolver::push(Host *h)
        in_queue.push_back(h);
 }
 
+void Resolver::cancel(Host *h)
+{
+       MutexLock l_(mutex);
+
+       if(h==current)
+       {
+               current=0;
+               return;
+       }
+
+       for(list<Host *>::iterator i=in_queue.begin(); i!=in_queue.end(); ++i)
+               if(*i==h)
+               {
+                       in_queue.erase(i);
+                       break;
+               }
+}
+
 void Resolver::tick()
 {
        MutexLock l_(mutex);
@@ -49,24 +67,24 @@ void Resolver::main()
        {
                while(!done)
                {
-                       Host *host;
+                       sockaddr_in addr;
+                       addr.sin_family = AF_INET;
                        {
                                MutexLock l_(mutex);
                                if(in_queue.empty())
                                        break;
-                               host = in_queue.front();
+                               current = in_queue.front();
                                in_queue.erase(in_queue.begin());
+                               addr.sin_addr.s_addr = htonl(current->get_address());
                        }
                        
-                       sockaddr_in addr;
-                       addr.sin_family = AF_INET;
-                       addr.sin_addr.s_addr = htonl(host->get_address());
                        char buf[128];
                        int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(addr), buf, sizeof(buf), 0, 0, NI_NOFQDN|NI_NAMEREQD);
                        if(err==0)
                        {
                                MutexLock l_(mutex);
-                               out_queue.push_back(Result(host, buf));
+                               if(current)
+                                       out_queue.push_back(Result(current, buf));
                        }
                }
 
index fb9dd10891871d5f34b0e1929416df111cdeb871..4b6e4986326fafa25249f6d0a99132b50f5ac3fc 100644 (file)
@@ -27,6 +27,7 @@ private:
 
        std::list<Host *> in_queue;
        std::list<Result> out_queue;
+       Host *current;
        Msp::Mutex mutex;
        bool done;
 
@@ -35,6 +36,7 @@ public:
        ~Resolver();
 
        void push(Host *);
+       void cancel(Host *);
        void tick();
 private:
        void main();