]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/resolve.cpp
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / net / resolve.cpp
index cd65b9caccc66b6fb0a88f813850ea387d9ffaac..9ec5395df99c5b2504965dbb998029d0933f7a30 100644 (file)
@@ -1,9 +1,9 @@
-#include "platform_api.h"
+#include "resolve.h"
 #include <msp/core/systemerror.h>
 #include <msp/strings/format.h>
+#include "platform_api.h"
 #include "sockaddr_private.h"
 #include "socket.h"
-#include "resolve.h"
 
 using namespace std;
 
@@ -40,16 +40,16 @@ namespace Net {
 
 SockAddr *resolve(const string &host, const string &serv, Family family)
 {
-       const char *chost = (host.empty() ? 0 : host.c_str());
-       const char *cserv = (serv.empty() ? 0 : serv.c_str());
+       const char *chost = (host.empty() ? nullptr : host.c_str());
+       const char *cserv = (serv.empty() ? nullptr : serv.c_str());
        int flags = 0;
        if(host=="*")
        {
                flags = AI_PASSIVE;
-               chost = 0;
+               chost = nullptr;
        }
 
-       addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 };
+       addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, nullptr, nullptr, nullptr };
        addrinfo *res;
 
        int err = getaddrinfo(chost, cserv, &hints, &res);
@@ -81,9 +81,7 @@ SockAddr *resolve(const string &str, Family family)
 }
 
 
-Resolver::Resolver():
-       event_disp(0),
-       next_tag(1)
+Resolver::Resolver()
 {
        thread.get_notify_pipe().signal_data_available.connect(sigc::mem_fun(this, &Resolver::task_done));
 }
@@ -104,7 +102,7 @@ unsigned Resolver::resolve(const string &host, const string &serv, Family family
        task.host = host;
        task.serv = serv;
        task.family = family;
-       thread.add_task(task);
+       thread.add_task(move(task));
        return task.tag;
 }
 
@@ -135,8 +133,7 @@ void Resolver::task_done()
                {
                        if(signal_resolve_failed.empty())
                        {
-                               RefPtr<runtime_error> err = task->error;
-                               task->error = 0;
+                               unique_ptr<runtime_error> err = move(task->error);
                                thread.pop_complete_task();
                                throw *err;
                        }
@@ -147,18 +144,9 @@ void Resolver::task_done()
 }
 
 
-Resolver::Task::Task():
-       tag(0),
-       family(UNSPEC),
-       addr(0),
-       error(0)
-{ }
-
-
 Resolver::WorkerThread::WorkerThread():
        Thread("Resolver"),
-       sem(1),
-       done(false)
+       sem(1)
 {
        launch();
 }
@@ -170,11 +158,11 @@ Resolver::WorkerThread::~WorkerThread()
        join();
 }
 
-void Resolver::WorkerThread::add_task(const Task &t)
+void Resolver::WorkerThread::add_task(Task &&t)
 {
        MutexLock lock(queue_mutex);
        bool was_starved = (queue.empty() || queue.back().is_complete());
-       queue.push_back(t);
+       queue.push_back(move(t));
        if(was_starved)
                sem.signal();
 }
@@ -185,18 +173,14 @@ Resolver::Task *Resolver::WorkerThread::get_complete_task()
        if(!queue.empty() && queue.front().is_complete())
                return &queue.front();
        else
-               return 0;
+               return nullptr;
 }
 
 void Resolver::WorkerThread::pop_complete_task()
 {
        MutexLock lock(queue_mutex);
        if(!queue.empty() && queue.front().is_complete())
-       {
-               delete queue.front().addr;
-               delete queue.front().error;
                queue.pop_front();
-       }
 }
 
 void Resolver::WorkerThread::main()
@@ -208,10 +192,10 @@ void Resolver::WorkerThread::main()
                        sem.wait();
                wait = false;
 
-               Task *task = 0;
+               Task *task = nullptr;
                {
                        MutexLock lock(queue_mutex);
-                       for(deque<Task>::iterator i=queue.begin(); (!task && i!=queue.end()); ++i)
+                       for(auto i=queue.begin(); (!task && i!=queue.end()); ++i)
                                if(!i->is_complete())
                                        task = &*i;
                }
@@ -220,16 +204,16 @@ void Resolver::WorkerThread::main()
                {
                        try
                        {
-                               SockAddr *addr = Net::resolve(task->host, task->serv, task->family);
+                               unique_ptr<SockAddr> addr(Net::resolve(task->host, task->serv, task->family));
                                {
                                        MutexLock lock(queue_mutex);
-                                       task->addr = addr;
+                                       task->addr = move(addr);
                                }
                        }
                        catch(const runtime_error &e)
                        {
                                MutexLock lock(queue_mutex);
-                               task->error = new runtime_error(e);
+                               task->error = make_unique<runtime_error>(e);
                        }
                        notify_pipe.put(1);
                }