1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <winsock2.h> 6 7#include "net/base/winsock_init.h" 8 9#include "base/lazy_instance.h" 10#include "base/logging.h" 11 12namespace { 13 14class WinsockInitSingleton { 15 public: 16 WinsockInitSingleton() { 17 WORD winsock_ver = MAKEWORD(2, 2); 18 WSAData wsa_data; 19 bool did_init = (WSAStartup(winsock_ver, &wsa_data) == 0); 20 if (did_init) { 21 DCHECK(wsa_data.wVersion == winsock_ver); 22 23 // The first time WSAGetLastError is called, the delay load helper will 24 // resolve the address with GetProcAddress and fixup the import. If a 25 // third party application hooks system functions without correctly 26 // restoring the error code, it is possible that the error code will be 27 // overwritten during delay load resolution. The result of the first 28 // call may be incorrect, so make sure the function is bound and future 29 // results will be correct. 30 WSAGetLastError(); 31 } 32 } 33 34 ~WinsockInitSingleton() { 35 // Don't call WSACleanup() since the worker pool threads can continue to 36 // call getaddrinfo() after Winsock has shutdown, which can lead to crashes. 37 } 38}; 39 40static base::LazyInstance<WinsockInitSingleton> g_winsock_init_singleton( 41 base::LINKER_INITIALIZED); 42 43} // namespace 44 45namespace net { 46 47void EnsureWinsockInit() { 48 g_winsock_init_singleton.Get(); 49} 50 51} // namespace net 52