diff options
author | Elliott Hughes <enh@google.com> | 2014-05-28 19:35:33 +0000 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-05-28 18:31:15 -0700 |
commit | b30aff405a220495941f1673b0a5e66c4fa8b84c (patch) | |
tree | 3bf667c009cf468c040ccaae6e81d468b4fd0254 /libc/private/bionic_tls.h | |
parent | 52f74322b1d72d57146107f32ee2c76c421bf4b1 (diff) | |
download | android_bionic-b30aff405a220495941f1673b0a5e66c4fa8b84c.tar.gz android_bionic-b30aff405a220495941f1673b0a5e66c4fa8b84c.tar.bz2 android_bionic-b30aff405a220495941f1673b0a5e66c4fa8b84c.zip |
Revert "Revert "Lose the hand-written futex assembler.""
The problem with the original patch was that using syscall(3) means that
errno can be set, but pthread_create(3) was abusing the TLS errno slot as
a pthread_mutex_t for the thread startup handshake.
There was also a mistake in the check for syscall failures --- it should
have checked against -1 instead of 0 (not just because that's the default
idiom, but also here because futex(2) can legitimately return values > 0).
This patch stops abusing the TLS errno slot and adds a pthread_mutex_t to
pthread_internal_t instead. (Note that for LP64 sizeof(pthread_mutex_t) >
sizeof(uintptr_t), so we could potentially clobber other TLS slots too.)
I've also rewritten the LP32 compatibility stubs to directly reuse the
code from the .h file.
This reverts commit 75c55ff84ebfa686c7ae2cc8ee431c6a33bd46b4.
Bug: 15195455
Change-Id: I6ffb13e5cf6a35d8f59f692d94192aae9ab4593d
Diffstat (limited to 'libc/private/bionic_tls.h')
-rw-r--r-- | libc/private/bionic_tls.h | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h index c2cf196d6..b52013f5c 100644 --- a/libc/private/bionic_tls.h +++ b/libc/private/bionic_tls.h @@ -46,32 +46,27 @@ __BEGIN_DECLS ** pre-allocated slot directly for performance reason). **/ -/* Well-known TLS slots. What data goes in which slot is arbitrary unless otherwise noted. */ +// Well-known TLS slots. What data goes in which slot is arbitrary unless otherwise noted. enum { - TLS_SLOT_SELF = 0, /* The kernel requires this specific slot for x86. */ + TLS_SLOT_SELF = 0, // The kernel requires this specific slot for x86. TLS_SLOT_THREAD_ID, TLS_SLOT_ERRNO, - /* This slot in the child's TLS is used to synchronize the parent and child - * during thread initialization. The child finishes with this mutex before - * running any code that can set errno, so we can reuse the errno slot. */ - TLS_SLOT_START_MUTEX = TLS_SLOT_ERRNO, - - /* These two aren't used by bionic itself, but allow the graphics code to - * access TLS directly rather than using the pthread API. */ + // These two aren't used by bionic itself, but allow the graphics code to + // access TLS directly rather than using the pthread API. TLS_SLOT_OPENGL_API = 3, TLS_SLOT_OPENGL = 4, - /* This slot is only used to pass information from the dynamic linker to - * libc.so when the C library is loaded in to memory. The C runtime init - * function will then clear it. Since its use is extremely temporary, - * we reuse an existing location that isn't needed during libc startup. */ + // This slot is only used to pass information from the dynamic linker to + // libc.so when the C library is loaded in to memory. The C runtime init + // function will then clear it. Since its use is extremely temporary, + // we reuse an existing location that isn't needed during libc startup. TLS_SLOT_BIONIC_PREINIT = TLS_SLOT_OPENGL_API, - TLS_SLOT_STACK_GUARD = 5, /* GCC requires this specific slot for x86. */ + TLS_SLOT_STACK_GUARD = 5, // GCC requires this specific slot for x86. TLS_SLOT_DLERROR, - TLS_SLOT_FIRST_USER_SLOT /* Must come last! */ + TLS_SLOT_FIRST_USER_SLOT // Must come last! }; /* |