+ parse_host_serv(str, host, serv);
+
+ return resolve(host, serv, family);
+}
+
+
+Resolver::Resolver()
+{
+ thread.get_notify_pipe().signal_data_available.connect(sigc::mem_fun(this, &Resolver::task_done));
+}
+
+void Resolver::use_event_dispatcher(IO::EventDispatcher *ed)
+{
+ if(event_disp)
+ event_disp->remove(thread.get_notify_pipe());
+ event_disp = ed;
+ if(event_disp)
+ event_disp->add(thread.get_notify_pipe());
+}
+
+unsigned Resolver::resolve(const string &host, const string &serv, Family family)
+{
+ Task task;
+ task.tag = next_tag++;
+ task.host = host;
+ task.serv = serv;
+ task.family = family;
+ thread.add_task(task);
+ return task.tag;
+}
+
+unsigned Resolver::resolve(const string &str, Family family)
+{
+ string host, serv;
+ parse_host_serv(str, host, serv);
+
+ return resolve(host, serv, family);
+}
+
+void Resolver::tick()
+{
+ if(IO::poll(thread.get_notify_pipe(), IO::P_INPUT, Time::zero))
+ task_done();
+}
+
+void Resolver::task_done()
+{
+ char buf[64];
+ thread.get_notify_pipe().read(buf, sizeof(buf));
+
+ while(Task *task = thread.get_complete_task())