15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_BASE_WINSOCK_UTIL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_BASE_WINSOCK_UTIL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winsock2.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_export.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assert that the (manual-reset) event object is not signaled. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertEventNotSignaled(WSAEVENT hEvent); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the (manual-reset) event object is signaled, resets it and returns true. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, does nothing and returns false. Called after a Winsock function 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// succeeds synchronously 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Our testing shows that except in rare cases (when running inside QEMU), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the event object is already signaled at this point, so we call this method 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to avoid a context switch in common cases. This is just a performance 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// optimization. The code still works if this function simply returns false. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ResetEventIfSignaled(WSAEVENT hEvent); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Interface to create Windows Socket. 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Usually such factories are used for testing purposes, which is not true in 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// this case. This interface is used to substitute WSASocket to make possible 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// execution of some network code in sandbox. 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass NET_EXPORT PlatformSocketFactory { 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PlatformSocketFactory() {} 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~PlatformSocketFactory() {} 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Creates Windows socket. See WSASocket documentation of parameters. 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual SOCKET CreateSocket(int family, int type, int protocol) = 0; 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Replace WSASocket with given factory. The factory will be used by 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // CreatePlatformSocket. 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static void SetInstance(PlatformSocketFactory* factory); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Creates Windows Socket. See WSASocket documentation of parameters. 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSOCKET CreatePlatformSocket(int family, int type, int protocol); 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_BASE_WINSOCK_UTIL_H_ 50