summaryrefslogtreecommitdiffstats
path: root/libc/bionic
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2013-10-09 20:49:09 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-10-09 20:49:10 +0000
commit0c17099a71cb5d1b36b7aab66fd7341b3fc9106d (patch)
tree4753b74b87e713379965bb051482036e6726afb1 /libc/bionic
parent777a4ee6771e6fe3362ef4f24244a44fcd0aabe4 (diff)
parent2a0b873065edb304fa2d1c54f8de663ea638b8ab (diff)
downloadbionic-0c17099a71cb5d1b36b7aab66fd7341b3fc9106d.zip
bionic-0c17099a71cb5d1b36b7aab66fd7341b3fc9106d.tar.gz
bionic-0c17099a71cb5d1b36b7aab66fd7341b3fc9106d.tar.bz2
Merge "Fix __errno for LP64 and clean up __get_tls."
Diffstat (limited to 'libc/bionic')
-rw-r--r--libc/bionic/__errno.cpp (renamed from libc/bionic/__errno.c)7
-rw-r--r--libc/bionic/__get_tls.cpp32
-rw-r--r--libc/bionic/libc_init_dynamic.cpp2
-rw-r--r--libc/bionic/pthread_create.cpp2
-rw-r--r--libc/bionic/pthread_internals.cpp3
-rw-r--r--libc/bionic/pthread_key.cpp7
6 files changed, 43 insertions, 10 deletions
diff --git a/libc/bionic/__errno.c b/libc/bionic/__errno.cpp
index 8f33cce..9caa618 100644
--- a/libc/bionic/__errno.c
+++ b/libc/bionic/__errno.cpp
@@ -25,10 +25,11 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
#include <errno.h>
#include <bionic_tls.h>
+#include <stdint.h>
-volatile int* __errno( void )
-{
- return &((volatile int*)__get_tls())[TLS_SLOT_ERRNO];
+volatile int* __errno() {
+ return reinterpret_cast<int*>(&(__get_tls()[TLS_SLOT_ERRNO]));
}
diff --git a/libc/bionic/__get_tls.cpp b/libc/bionic/__get_tls.cpp
new file mode 100644
index 0000000..d01e2aa
--- /dev/null
+++ b/libc/bionic/__get_tls.cpp
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+extern "C" void** __get_tls() {
+#include "private/__get_tls.h"
+ return __get_tls();
+}
diff --git a/libc/bionic/libc_init_dynamic.cpp b/libc/bionic/libc_init_dynamic.cpp
index 88e87a7..4e1374e 100644
--- a/libc/bionic/libc_init_dynamic.cpp
+++ b/libc/bionic/libc_init_dynamic.cpp
@@ -65,7 +65,7 @@ extern "C" {
// as soon as the shared library is loaded.
__attribute__((constructor)) static void __libc_preinit() {
// Read the kernel argument block pointer from TLS.
- void* tls = const_cast<void*>(__get_tls());
+ void** tls = __get_tls();
KernelArgumentBlock** args_slot = &reinterpret_cast<KernelArgumentBlock**>(tls)[TLS_SLOT_BIONIC_PREINIT];
KernelArgumentBlock* args = *args_slot;
diff --git a/libc/bionic/pthread_create.cpp b/libc/bionic/pthread_create.cpp
index 63695d3..9e06afc 100644
--- a/libc/bionic/pthread_create.cpp
+++ b/libc/bionic/pthread_create.cpp
@@ -50,6 +50,8 @@ extern "C" int __pthread_clone(void* (*fn)(void*), void* child_stack, int flags,
extern "C" void ATTRIBUTES _thread_created_hook(pid_t thread_id);
+extern "C" int __set_tls(void* ptr);
+
static const int kPthreadInitFailed = 1;
static pthread_mutex_t gPthreadStackCreationLock = PTHREAD_MUTEX_INITIALIZER;
diff --git a/libc/bionic/pthread_internals.cpp b/libc/bionic/pthread_internals.cpp
index 66bc5b7..59c6e48 100644
--- a/libc/bionic/pthread_internals.cpp
+++ b/libc/bionic/pthread_internals.cpp
@@ -64,6 +64,5 @@ __LIBC_ABI_PRIVATE__ void _pthread_internal_add(pthread_internal_t* thread) {
}
__LIBC_ABI_PRIVATE__ pthread_internal_t* __get_thread(void) {
- void** tls = reinterpret_cast<void**>(const_cast<void*>(__get_tls()));
- return reinterpret_cast<pthread_internal_t*>(tls[TLS_SLOT_THREAD_ID]);
+ return reinterpret_cast<pthread_internal_t*>(__get_tls()[TLS_SLOT_THREAD_ID]);
}
diff --git a/libc/bionic/pthread_key.cpp b/libc/bionic/pthread_key.cpp
index 7e8b4cd..706758b 100644
--- a/libc/bionic/pthread_key.cpp
+++ b/libc/bionic/pthread_key.cpp
@@ -133,7 +133,7 @@ class ScopedTlsMapAccess {
// from this thread's TLS area. This must call the destructor of all keys
// that have a non-NULL data value and a non-NULL destructor.
void CleanAll() {
- void** tls = (void**)__get_tls();
+ void** tls = __get_tls();
// Because destructors can do funky things like deleting/creating other
// keys, we need to implement this in a loop.
@@ -239,8 +239,7 @@ void* pthread_getspecific(pthread_key_t key) {
// to check that the key is properly allocated. If the key was not
// allocated, the value read from the TLS should always be NULL
// due to pthread_key_delete() clearing the values for all threads.
- uintptr_t address = reinterpret_cast<volatile uintptr_t*>(__get_tls())[key];
- return reinterpret_cast<void*>(address);
+ return __get_tls()[key];
}
int pthread_setspecific(pthread_key_t key, const void* ptr) {
@@ -250,6 +249,6 @@ int pthread_setspecific(pthread_key_t key, const void* ptr) {
return EINVAL;
}
- reinterpret_cast<volatile uintptr_t*>(__get_tls())[key] = reinterpret_cast<uintptr_t>(ptr);
+ __get_tls()[key] = const_cast<void*>(ptr);
return 0;
}