Resolver::~Resolver()
{
- done=true;
+ done = true;
join();
}
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;
+ }
+
+ for(list<Result>::iterator i=out_queue.begin(); i!=out_queue.end(); ++i)
+ if(i->host==h)
+ {
+ out_queue.erase(i);
+ break;
+ }
+}
+
void Resolver::tick()
{
MutexLock l_(mutex);
{
while(!done)
{
- while(1)
+ while(!done)
{
- Host *host;
+ sockaddr_storage addr;
{
MutexLock l_(mutex);
if(in_queue.empty())
break;
- host=in_queue.front();
+ current = in_queue.front();
in_queue.erase(in_queue.begin());
+ current->get_address().to_sockaddr(addr);
}
- 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);
+ 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));
}
}
- Time::sleep(Time::sec);
+ Time::sleep(100*Time::msec);
}
}