1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/winsock_util.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/net_errors.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Prevent the compiler from optimizing away the arguments so they appear
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// nicely on the stack in crash dumps.
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma warning (disable: 4748)
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma optimize( "", off )
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Pass the important values as function arguments so that they are available
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// in crash dumps.
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CheckEventWait(WSAEVENT hEvent, DWORD wait_rv, DWORD expected) {
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (wait_rv != expected) {
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DWORD err = ERROR_SUCCESS;
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (wait_rv == WAIT_FAILED)
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      err = GetLastError();
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CHECK(false);  // Crash.
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma optimize( "", on )
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma warning (default: 4748)
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid AssertEventNotSignaled(WSAEVENT hEvent) {
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DWORD wait_rv = WaitForSingleObject(hEvent, 0);
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CheckEventWait(hEvent, wait_rv, WAIT_TIMEOUT);
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ResetEventIfSignaled(WSAEVENT hEvent) {
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(wtc): Remove the CHECKs after enough testing.
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DWORD wait_rv = WaitForSingleObject(hEvent, 0);
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (wait_rv == WAIT_TIMEOUT)
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;  // The event object is not signaled.
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CheckEventWait(hEvent, wait_rv, WAIT_OBJECT_0);
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BOOL ok = WSAResetEvent(hEvent);
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CHECK(ok);
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace net
52