summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-13 17:48:18 +0000
committerjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-13 17:48:18 +0000
commita32da25057698ef8e113e2c9432e2b88164ab4ae (patch)
tree23cebd27db51c6396a1414d1847630fe62ebbd3c /base
parent4133452bfc51b08d983f4045cc3e0418c43d45e4 (diff)
downloadchromium_src-a32da25057698ef8e113e2c9432e2b88164ab4ae.zip
chromium_src-a32da25057698ef8e113e2c9432e2b88164ab4ae.tar.gz
chromium_src-a32da25057698ef8e113e2c9432e2b88164ab4ae.tar.bz2
Revert 113748 - Provide windows notifictaion of thread termination
[Karen Grunberg requested a speculative revert, because we are currently unable to complete a link of the canary. This change is working fine on the Dev branch, and did not impact the link over the weekend, but for lack of other items, this change is being reverted] This code should only have much of an impact on the XP platform, where thread teardown notification are not currently made. Provide an automatic fallback scan of the linker list of notifcation callbacks via DllMain. This fallback is ONLY used if there are no notifications coming via the linker list. This allows all existing code to continue working as it does today, and provides thread teardown notifcatino on XP even though we use the LoadLibrary call. It is a minimal change, suitable for pushing to other channels (beta? stable?). r=cpu BUG=103209 Review URL: http://codereview.chromium.org/8836003 TBR=jar@chromium.org Review URL: http://codereview.chromium.org/8934006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@114229 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/base.gyp1
-rw-r--r--base/win/dllmain.cc125
2 files changed, 0 insertions, 126 deletions
diff --git a/base/base.gyp b/base/base.gyp
index b37ddb0..efc0333 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -121,7 +121,6 @@
'at_exit_unittest.cc',
'atomicops_unittest.cc',
'base64_unittest.cc',
- 'win/dllmain.cc',
'bind_unittest.cc',
'bind_unittest.nc',
'bits_unittest.cc',
diff --git a/base/win/dllmain.cc b/base/win/dllmain.cc
deleted file mode 100644
index 8e0ce4b..0000000
--- a/base/win/dllmain.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.
-
-// Windows doesn't support pthread_key_create's destr_function, and in fact
-// it's a bit tricky to get code to run when a thread exits. This is
-// cargo-cult magic from http://www.codeproject.com/threads/tls.asp.
-// We are trying to be compatible with both a LoadLibrary style invocation, as
-// well as static linking. This code only needs to be included if we use
-// LoadLibrary, but it hooks into the "standard" set of TLS callbacks that are
-// provided for static linking.
-
-// This code is deliberately written to match the style of calls seen in
-// base/threading/thread_local_storage_win.cc. Please keep the two in sync if
-// coding conventions are changed.
-
-// WARNING: Do *NOT* try to include this in the construction of the base
-// library, even though it potentially drives code in
-// base/threading/thread_local_storage_win.cc. If you do, some users will end
-// up getting duplicate definition of DllMain() in some of their later links.
-
-// Force a reference to _tls_used to make the linker create the TLS directory
-// if it's not already there (that is, even if __declspec(thread) is not used).
-// To make sure we really traverse the whole list, we put down two elements, and
-// then check that we called both functions when we scanned the list.
-// Force a reference to p_thread_callback_dllmain_first_entry and
-// p_thread_callback_dllmain_first_entry to prevent whole program optimization
-// from discarding the variables.
-
-#include <windows.h>
-
-#include "base/logging.h"
-
-// Indicate if another service is scanning the callbacks. When this becomes
-// set to true, then DllMain() will stop supporting the callback service. This
-// value is set to true the first time any of our callbacks are called, as that
-// shows that some other service is handling callbacks.
-static bool linker_notifications_are_active = false;
-
-// This will be our mostly no-op callback that we'll list (twice). We won't
-// deliberately call it, and if it is called, that means we don't need to do any
-// of the callbacks anymore. We expect such a call to arrive via a
-// THREAD_ATTACH message, long before we'd have to perform our THREAD_DETACH
-// callbacks.
-static void NTAPI on_callback(PVOID h, DWORD reason, PVOID reserved);
-
-#ifdef _WIN64
-
-#pragma comment(linker, "/INCLUDE:_tls_used")
-#pragma comment(linker, "/INCLUDE:p_thread_callback_dllmain_first_entry")
-#pragma comment(linker, "/INCLUDE:p_thread_callback_dllmain_later_entry")
-
-#else // _WIN64
-
-#pragma comment(linker, "/INCLUDE:__tls_used")
-#pragma comment(linker, "/INCLUDE:_p_thread_callback_dllmain_first_entry")
-#pragma comment(linker, "/INCLUDE:_p_thread_callback_dllmain_later_entry")
-
-#endif // _WIN64
-
-// extern "C" suppresses C++ name mangling so we know the symbol names for the
-// linker /INCLUDE:symbol pragmas above.
-extern "C" {
-#ifdef _WIN64
-
-// .CRT section is merged with .rdata on x64 so it must be constant data.
-#pragma data_seg(push, old_seg)
-// Use earliest possible name in the .CRT$XL? list of segments.
-#pragma const_seg(".CRT$XLA")
-// When defining a const variable, it must have external linkage to be sure the
-// linker doesn't discard it.
-extern const PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_first_entry;
-const PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_first_entry = on_callback;
-// The latest possible name in the .CRT$XL? (other than *Z, which has a NULL).
-#pragma const_seg(".CRT$XLY")
-extern const PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_later_entry;
-const PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_later_entry = on_callback;
-#pragma data_seg(pop, old_seg)
-
-#else // _WIN64
-
-#pragma data_seg(push, old_seg)
-// Use earliest possible name in the .CRT$XL? list of segments.
-#pragma data_seg(".CRT$XLA")
-PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_first_entry = on_callback;
-// The latest possible name in the .CRT$XL? (other than *Z, which has a NULL).
-#pragma data_seg(".CRT$XLY")
-PIMAGE_TLS_CALLBACK p_thread_callback_dllmain_later_entry = on_callback;
-#pragma data_seg(pop, old_seg)
-
-#endif // _WIN64
-} // extern "C"
-
-
-// Make DllMain call the listed callbacks. This way any third parties that are
-// linked in will also be called.
-BOOL WINAPI DllMain(PVOID h, DWORD reason, PVOID reserved) {
- if (DLL_THREAD_DETACH != reason && DLL_PROCESS_DETACH != reason)
- return true; // We won't service THREAD_ATTACH calls.
-
- if (linker_notifications_are_active)
- return true; // Some other service is doing this work.
-
- // Use our first entry as a starting point, but don't call it.
- PIMAGE_TLS_CALLBACK* it = &p_thread_callback_dllmain_first_entry;
- while (*++it != NULL || it < &p_thread_callback_dllmain_later_entry) {
- if (*it == NULL || *it == on_callback)
- continue; // Don't bother to call our own callback.
- (*it)(h, reason, reserved);
- }
- return true;
-}
-
-static void NTAPI on_callback(PVOID h, DWORD reason, PVOID reserved) {
- // Do nothing. We were just a place holder in the list used to test that we
- // call all items.
- // If we are called, it means that some other system is scanning the callbacks
- // and we don't need to do so in DllMain().
- linker_notifications_are_active = true;
- // Note: If some other routine some how plays this same game... we could both
- // decide not to do the scanning <sigh>, but this trick should suppress
- // duplicate calls on Vista, where the runtime takes care of the callbacks,
- // and allow us to do the callbacks on XP, where we are currently devoid of
- // callbacks (due to an explicit LoadLibrary call).
-}