summaryrefslogtreecommitdiff
path: root/libc/private/bionic_globals.h
diff options
context:
space:
mode:
authorRyan Prichard <rprichard@google.com>2019-01-18 01:00:59 -0800
committerRyan Prichard <rprichard@google.com>2019-01-25 17:53:01 -0800
commit16455b5100ea46b930c1fa84d6bc905b7977643d (patch)
tree2cbeacaeecab2980c47fbf21ce860d44d86ea8c6 /libc/private/bionic_globals.h
parent3b463cf7f4f7fa54567ff42f6772091b22add2b8 (diff)
Implement dynamic TLS accesses and allocation
Initialize a thread's DTV to an empty zeroed DTV. Allocate the DTV and any ELF module's TLS segment on-demand in __tls_get_addr. Use a generation counter, incremented in the linker, to signal when threads should update/reallocate their DTV objects. A generation count of 0 always indicates the constant zero DTV. Once a DTV is allocated, it isn't freed until the thread exits, because a signal handler could interrupt the fast path of __tls_get_addr between accessing the DTV slot and reading a field of the DTV. Bionic keeps a linked list of DTV objects so it can free them at thread-exit. Dynamic TLS memory is allocated using a BionicAllocator instance in libc_shared_globals. For async-signal safety, access to the linker/libc-shared state is protected by first blocking signals, then by acquiring the reader-writer lock, TlsModules::rwlock. A write lock is needed to allocate or free memory. In pthread_exit, unconditionally block signals before freeing dynamic TLS memory or freeing the shadow call stack. ndk_cruft.cpp: Avoid including pthread_internal.h inside an extern "C". (The header now includes a C++ template that doesn't compile inside extern "C".) Bug: http://b/78026329 Bug: http://b/123094171 Test: bionic unit tests Change-Id: I3c9b12921c9e68b33dcc1d1dd276bff364eff5d7
Diffstat (limited to 'libc/private/bionic_globals.h')
-rw-r--r--libc/private/bionic_globals.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/libc/private/bionic_globals.h b/libc/private/bionic_globals.h
index 4d40476a5..21a2a249b 100644
--- a/libc/private/bionic_globals.h
+++ b/libc/private/bionic_globals.h
@@ -33,6 +33,7 @@
#include <link.h>
#include <pthread.h>
+#include "private/bionic_allocator.h"
#include "private/bionic_elf_tls.h"
#include "private/bionic_fdsan.h"
#include "private/bionic_malloc_dispatch.h"
@@ -70,6 +71,7 @@ struct libc_shared_globals {
StaticTlsLayout static_tls_layout;
TlsModules tls_modules;
+ BionicAllocator tls_allocator;
// Values passed from the linker to libc.so.
const char* init_progname = nullptr;