aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2013-12-07 16:38:08 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-12-07 16:38:09 +0000
commitb39599286d03db13f51a79e4cfe6644da0079f1a (patch)
tree07785e035365c55c1720f26db8086fcd5cb778ad
parent3377165387d455d4cb56807a9c02cd2ece6cb24b (diff)
parent101fb7d963ed362c4e351d95e55cbd70dc59eac3 (diff)
downloadbionic-idea133.tar.gz
Merge "Do not clear tids on detached threads."idea133
-rw-r--r--libc/bionic/pthread_exit.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/libc/bionic/pthread_exit.cpp b/libc/bionic/pthread_exit.cpp
index 22c2c3c1d..c1140de9d 100644
--- a/libc/bionic/pthread_exit.cpp
+++ b/libc/bionic/pthread_exit.cpp
@@ -36,6 +36,7 @@
extern "C" void _exit_with_stack_teardown(void*, size_t, int);
extern "C" void __exit(int);
+extern "C" int __set_tid_address(int*);
/* CAVEAT: our implementation of pthread_cleanup_push/pop doesn't support C++ exceptions
* and thread cancelation
@@ -94,6 +95,9 @@ void pthread_exit(void* return_value) {
pthread_mutex_lock(&gThreadListLock);
if ((thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) != 0) {
// The thread is detached, so we can destroy the pthread_internal_t.
+ // First make sure that the thread does not try to clear the tid since
+ // it points into memory that will be freed.
+ __set_tid_address(NULL);
_pthread_internal_remove_locked(thread);
} else {
// Make sure that the pthread_internal_t doesn't have stale pointers to a stack that