diff options
Diffstat (limited to 'chromium/net/base/winsock_init.cc')
-rw-r--r-- | chromium/net/base/winsock_init.cc | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/chromium/net/base/winsock_init.cc b/chromium/net/base/winsock_init.cc new file mode 100644 index 00000000000..e7601859e78 --- /dev/null +++ b/chromium/net/base/winsock_init.cc @@ -0,0 +1,51 @@ +// 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 <winsock2.h> + +#include "net/base/winsock_init.h" + +#include "base/lazy_instance.h" +#include "base/logging.h" + +namespace { + +class WinsockInitSingleton { + public: + WinsockInitSingleton() { + WORD winsock_ver = MAKEWORD(2, 2); + WSAData wsa_data; + bool did_init = (WSAStartup(winsock_ver, &wsa_data) == 0); + if (did_init) { + DCHECK(wsa_data.wVersion == winsock_ver); + + // The first time WSAGetLastError is called, the delay load helper will + // resolve the address with GetProcAddress and fixup the import. If a + // third party application hooks system functions without correctly + // restoring the error code, it is possible that the error code will be + // overwritten during delay load resolution. The result of the first + // call may be incorrect, so make sure the function is bound and future + // results will be correct. + WSAGetLastError(); + } + } + + ~WinsockInitSingleton() { + // Don't call WSACleanup() since the worker pool threads can continue to + // call getaddrinfo() after Winsock has shutdown, which can lead to crashes. + } +}; + +static base::LazyInstance<WinsockInitSingleton> g_winsock_init_singleton = + LAZY_INSTANCE_INITIALIZER; + +} // namespace + +namespace net { + +void EnsureWinsockInit() { + g_winsock_init_singleton.Get(); +} + +} // namespace net |