blob: 2c214379b376a912e04ceef864ddf753f5d12bc6 [file] [log] [blame]
From 28a638ff22f598f6aa9388db6a4cf13fe9f11644 Mon Sep 17 00:00:00 2001
From: Hirokazu Honda <hiroh@google.com>
Date: Wed, 1 Aug 2018 17:03:18 +0900
Subject: [PATCH] ThreadLocalStorage: Add a function to destroy pthread key
used in libchrome
MojoProcessSupport needs to destroy pthread key which is globally used in libchrome. The key is
stored in a local variable in thread_local_storage.cc.
This adds a function to destroy the key so that MojoProcessSupport can do it.
Bug: 110722333
Test: No crash in opening DRMInfo.app
Test: PlayStore still works
Test: cheets_ContainerSmokeTest and cheets_LoginScreen
Change-Id: Ib10c83deb5f7ef141d4ab9883e0d2c31d422a1b1
---
base/threading/thread_local_storage.cc | 11 +++++++++++
base/threading/thread_local_storage.h | 7 +++++++
2 files changed, 18 insertions(+)
diff --git a/base/threading/thread_local_storage.cc b/base/threading/thread_local_storage.cc
index 48c1dd5..90ae69e 100644
--- a/base/threading/thread_local_storage.cc
+++ b/base/threading/thread_local_storage.cc
@@ -247,6 +247,17 @@ void PlatformThreadLocalStorage::OnThreadExit() {
void PlatformThreadLocalStorage::OnThreadExit(void* value) {
OnThreadExitInternal(static_cast<TlsVectorEntry*>(value));
}
+
+// static
+void PlatformThreadLocalStorage::ForceFreeTLS() {
+ PlatformThreadLocalStorage::TLSKey key =
+ base::subtle::NoBarrier_AtomicExchange(
+ &g_native_tls_key,
+ PlatformThreadLocalStorage::TLS_KEY_OUT_OF_INDEXES);
+ if (key == PlatformThreadLocalStorage::TLS_KEY_OUT_OF_INDEXES)
+ return;
+ PlatformThreadLocalStorage::FreeTLS(key);
+}
#endif // defined(OS_WIN)
} // namespace internal
diff --git a/base/threading/thread_local_storage.h b/base/threading/thread_local_storage.h
index fd2a789..c5c7759 100644
--- a/base/threading/thread_local_storage.h
+++ b/base/threading/thread_local_storage.h
@@ -75,6 +75,13 @@ class BASE_EXPORT PlatformThreadLocalStorage {
// GetTLSValue() to retrieve the value of slot as it has already been reset
// in Posix.
static void OnThreadExit(void* value);
+ // Normally, Chrome runs as a process, so freeing the TLS is not needed since
+ // the OS will perform that while it's reclaiming the process' memory upon
+ // termination. If, however, this code is used inside a library that is
+ // dynamically loaded and unloaded, the consumer is responsible for calling
+ // this after all Chrome threads have stopped and prior to unloading the
+ // library.
+ static void ForceFreeTLS();
#endif
};
--
2.18.0.345.g5c9ce644c3-goog