diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-11 21:38:55 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-11 21:38:55 +0000 |
commit | 75aa495c44c3661779b36d2ec148ede3b256fb71 (patch) | |
tree | f23332b2abcfc74beadc946fd2f8bb624d24e240 /net/socket/tcp_client_socket_win.cc | |
parent | a3d677d8ff537f07aba274a61e0621a3db9af074 (diff) | |
download | chromium_src-75aa495c44c3661779b36d2ec148ede3b256fb71.zip chromium_src-75aa495c44c3661779b36d2ec148ede3b256fb71.tar.gz chromium_src-75aa495c44c3661779b36d2ec148ede3b256fb71.tar.bz2 |
Revert 77855 - UDP sockets implementation for windows.
BUG=None
TEST=Unittests
Review URL: http://codereview.chromium.org/6658027
TBR=sergeyu@chromium.org
Review URL: http://codereview.chromium.org/6685015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77866 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/tcp_client_socket_win.cc')
-rw-r--r-- | net/socket/tcp_client_socket_win.cc | 87 |
1 files changed, 86 insertions, 1 deletions
diff --git a/net/socket/tcp_client_socket_win.cc b/net/socket/tcp_client_socket_win.cc index 6d733fa..9e93bf0 100644 --- a/net/socket/tcp_client_socket_win.cc +++ b/net/socket/tcp_client_socket_win.cc @@ -22,12 +22,97 @@ #include "net/base/network_change_notifier.h" #include "net/base/sys_addrinfo.h" #include "net/base/winsock_init.h" -#include "net/base/winsock_util.h" namespace net { namespace { +// Prevent the compiler from optimizing away the arguments so they appear +// nicely on the stack in crash dumps. +#pragma warning (disable: 4748) +#pragma optimize( "", off ) + +// Pass the important values as function arguments so that they are available +// in crash dumps. +void CheckEventWait(WSAEVENT hEvent, DWORD wait_rv, DWORD expected) { + if (wait_rv != expected) { + DWORD err = ERROR_SUCCESS; + if (wait_rv == WAIT_FAILED) + err = GetLastError(); + CHECK(false); // Crash. + } +} + +#pragma optimize( "", on ) +#pragma warning (default: 4748) + +// Assert that the (manual-reset) event object is not signaled. +void AssertEventNotSignaled(WSAEVENT hEvent) { + DWORD wait_rv = WaitForSingleObject(hEvent, 0); + CheckEventWait(hEvent, wait_rv, WAIT_TIMEOUT); +} + +// If the (manual-reset) event object is signaled, resets it and returns true. +// Otherwise, does nothing and returns false. Called after a Winsock function +// succeeds synchronously +// +// Our testing shows that except in rare cases (when running inside QEMU), +// the event object is already signaled at this point, so we call this method +// to avoid a context switch in common cases. This is just a performance +// optimization. The code still works if this function simply returns false. +bool ResetEventIfSignaled(WSAEVENT hEvent) { + // TODO(wtc): Remove the CHECKs after enough testing. + DWORD wait_rv = WaitForSingleObject(hEvent, 0); + if (wait_rv == WAIT_TIMEOUT) + return false; // The event object is not signaled. + CheckEventWait(hEvent, wait_rv, WAIT_OBJECT_0); + BOOL ok = WSAResetEvent(hEvent); + CHECK(ok); + return true; +} + +//----------------------------------------------------------------------------- + +int MapWinsockError(int os_error) { + // There are numerous Winsock error codes, but these are the ones we thus far + // find interesting. + switch (os_error) { + case WSAEACCES: + return ERR_ACCESS_DENIED; + case WSAENETDOWN: + return ERR_INTERNET_DISCONNECTED; + case WSAETIMEDOUT: + return ERR_TIMED_OUT; + case WSAECONNRESET: + case WSAENETRESET: // Related to keep-alive + return ERR_CONNECTION_RESET; + case WSAECONNABORTED: + return ERR_CONNECTION_ABORTED; + case WSAECONNREFUSED: + return ERR_CONNECTION_REFUSED; + case WSA_IO_INCOMPLETE: + case WSAEDISCON: + // WSAEDISCON is returned by WSARecv or WSARecvFrom for message-oriented + // sockets (where a return value of zero means a zero-byte message) to + // indicate graceful connection shutdown. We should not ever see this + // error code for TCP sockets, which are byte stream oriented. + LOG(DFATAL) << "Unexpected error " << os_error + << " mapped to net::ERR_UNEXPECTED"; + return ERR_UNEXPECTED; + case WSAEHOSTUNREACH: + case WSAENETUNREACH: + return ERR_ADDRESS_UNREACHABLE; + case WSAEADDRNOTAVAIL: + return ERR_ADDRESS_INVALID; + case ERROR_SUCCESS: + return OK; + default: + LOG(WARNING) << "Unknown error " << os_error + << " mapped to net::ERR_FAILED"; + return ERR_FAILED; + } +} + int MapConnectError(int os_error) { switch (os_error) { // connect fails with WSAEACCES when Windows Firewall blocks the |