summaryrefslogtreecommitdiff
path: root/chromium/net/base/winsock_init.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/base/winsock_init.cc')
-rw-r--r--chromium/net/base/winsock_init.cc51
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