| // Copyright (c) 2011 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 "net/base/winsock_util.h" |
| |
| #include "base/logging.h" |
| #include "net/base/net_errors.h" |
| |
| namespace net { |
| |
| namespace { |
| |
| // Prevent the compiler from optimizing away the arguments so they appear |
| // nicely on the stack in crash dumps. |
| #pragma warning(push) |
| #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(pop) |
| |
| } // namespace |
| |
| void AssertEventNotSignaled(WSAEVENT hEvent) { |
| DWORD wait_rv = WaitForSingleObject(hEvent, 0); |
| CheckEventWait(hEvent, wait_rv, WAIT_TIMEOUT); |
| } |
| |
| 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; |
| } |
| |
| } // namespace net |