Index: chrome/browser/sync/notifier/base/async_dns_lookup.cc |
=================================================================== |
--- chrome/browser/sync/notifier/base/async_dns_lookup.cc (revision 46353) |
+++ chrome/browser/sync/notifier/base/async_dns_lookup.cc (working copy) |
@@ -1,141 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/sync/notifier/base/async_dns_lookup.h" |
- |
-#include "build/build_config.h" |
- |
-#if defined(OS_POSIX) |
-#include <arpa/inet.h> |
-#include <netdb.h> |
-#include <netinet/in_systm.h> |
-#include <netinet/in.h> |
-#include <netinet/ip.h> |
-#include <sys/socket.h> |
-#include <sys/types.h> |
-#endif // defined(OS_POSIX) |
- |
-// Apparently, inet_aton() is available for Windows, but just not |
-// declared anywhere. We'd use inet_pton(), but it's Vista-only. |
-#if defined(OS_WIN) |
-int inet_aton(const char* cp, struct in_addr* inp); |
-#endif // defined(OS_WIN) |
- |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/logging.h" |
-#include "chrome/browser/sync/notifier/base/nethelpers.h" |
-#include "talk/base/byteorder.h" |
-#include "talk/base/common.h" |
-#include "talk/base/socketaddress.h" |
-#include "talk/base/thread.h" |
- |
-enum { MSG_TIMEOUT = talk_base::SignalThread::ST_MSG_FIRST_AVAILABLE }; |
- |
-#ifndef WIN32 |
-const int WSAHOST_NOT_FOUND = 11001; // Follows the format in winsock2.h. |
-#endif // WIN32 |
- |
-namespace notifier { |
- |
-AsyncDNSLookup::AsyncDNSLookup(const talk_base::SocketAddress& server) |
- : server_(new talk_base::SocketAddress(server)), |
- error_(0) { |
- // Timeout after 5 seconds. |
- talk_base::Thread::Current()->PostDelayed(5000, this, MSG_TIMEOUT); |
-} |
- |
-AsyncDNSLookup::~AsyncDNSLookup() { |
-} |
- |
-void AsyncDNSLookup::DoWork() { |
- std::string hostname(server_->IPAsString()); |
- |
- in_addr addr; |
- if (inet_aton(hostname.c_str(), &addr)) { |
- talk_base::CritScope scope(&cs_); |
- ip_list_.push_back(talk_base::NetworkToHost32(addr.s_addr)); |
- } else { |
- LOG(INFO) << "(" << hostname << ")"; |
- hostent ent; |
- char buffer[8192]; |
- int errcode = 0; |
- hostent* host = SafeGetHostByName(hostname.c_str(), &ent, |
- buffer, sizeof(buffer), |
- &errcode); |
- talk_base::Thread::Current()->Clear(this, MSG_TIMEOUT); |
- if (host) { |
- talk_base::CritScope scope(&cs_); |
- |
- // Check to see if this already timed out. |
- if (error_ == 0) { |
- for (int index = 0; true; ++index) { |
- uint32* addr = reinterpret_cast<uint32*>(host->h_addr_list[index]); |
- if (addr == 0) { // 0 = end of list. |
- break; |
- } |
- uint32 ip = talk_base::NetworkToHost32(*addr); |
- LOG(INFO) << "(" << hostname << ") resolved to: " |
- << talk_base::SocketAddress::IPToString(ip); |
- ip_list_.push_back(ip); |
- } |
- // Maintain the invariant that either the list is not empty or the |
- // error is non zero when we are done with processing the dnslookup. |
- if (ip_list_.empty() && error_ == 0) { |
- error_ = WSAHOST_NOT_FOUND; |
- } |
- } |
- FreeHostEnt(host); |
- } else { |
- { // Scoping for the critical section. |
- talk_base::CritScope scope(&cs_); |
- |
- // Check to see if this already timed out. |
- if (error_ == 0) { |
- error_ = errcode; |
- } |
- } |
- LOG(ERROR) << "(" << hostname << ") error: " << error_; |
- } |
- } |
-} |
- |
-void AsyncDNSLookup::OnMessage(talk_base::Message* message) { |
- ASSERT(message); |
- if (message->message_id == MSG_TIMEOUT) { |
- OnTimeout(); |
- } else { |
- talk_base::SignalThread::OnMessage(message); |
- } |
-} |
- |
-void AsyncDNSLookup::OnTimeout() { |
- // Allow the scope for the critical section to be the whole method, just to |
- // be sure that the worker thread can't exit while we are doing |
- // SignalWorkDone (because that could possibly cause the class to be |
- // deleted). |
- talk_base::CritScope scope(&cs_); |
- |
- // Check to see if the ip list was already filled (or errored out). |
- if (!ip_list_.empty() || error_ != 0) { |
- return; |
- } |
- |
- // Worker thread is taking too long so timeout. |
- error_ = WSAHOST_NOT_FOUND; |
- |
- // Rely on the caller to do the Release/Destroy. |
- // |
- // Doing this signal while holding cs_ won't cause a deadlock because the |
- // AsyncDNSLookup::DoWork thread doesn't have any locks at this point, and it |
- // is the only thread being held up by this. |
- SignalWorkDone(this); |
- |
- // Ensure that no more "WorkDone" signaling is done. |
- // Don't call Release or Destroy since that was already done by the callback. |
- SignalWorkDone.disconnect_all(); |
-} |
- |
-} // namespace notifier |