summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2012-03-12 17:10:46 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-03-12 17:10:46 -0700
commitbe741d472868a8ffcb455588f18cda889b0f465c (patch)
tree4c27624ea016135ce74398d7d4579e50e3583170
parent6d074bb71a316f73f35f4430a71fa706c46d4b75 (diff)
parent2f460fbee9abe2936175379c49c6618de7421233 (diff)
downloadbionic-be741d472868a8ffcb455588f18cda889b0f465c.zip
bionic-be741d472868a8ffcb455588f18cda889b0f465c.tar.gz
bionic-be741d472868a8ffcb455588f18cda889b0f465c.tar.bz2
am 2f460fbe: am 73b5cad9: Merge "bionic: Fix wrong kernel_id in pthread descriptor after fork()"
* commit '2f460fbee9abe2936175379c49c6618de7421233': bionic: Fix wrong kernel_id in pthread descriptor after fork()
-rw-r--r--libc/bionic/fork.c4
-rw-r--r--libc/bionic/pthread.c11
-rw-r--r--libc/private/bionic_pthread.h1
3 files changed, 16 insertions, 0 deletions
diff --git a/libc/bionic/fork.c b/libc/bionic/fork.c
index 0eedb01..2d5a10a 100644
--- a/libc/bionic/fork.c
+++ b/libc/bionic/fork.c
@@ -27,6 +27,7 @@
*/
#include <unistd.h>
#include "pthread_internal.h"
+#include "bionic_pthread.h"
#include "cpuacct.h"
extern int __fork(void);
@@ -48,6 +49,9 @@ int fork(void)
__timer_table_start_stop(0);
__bionic_atfork_run_parent();
} else {
+ /* Adjusting the kernel id after a fork */
+ (void)__pthread_settid(pthread_self(), gettid());
+
/*
* Newly created process must update cpu accounting.
* Call cpuacct_add passing in our uid, which will take
diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c
index 3435d21..885adcc 100644
--- a/libc/bionic/pthread.c
+++ b/libc/bionic/pthread.c
@@ -2011,3 +2011,14 @@ pid_t __pthread_gettid(pthread_t thid)
pthread_internal_t* thread = (pthread_internal_t*)thid;
return thread->kernel_id;
}
+
+int __pthread_settid(pthread_t thid, pid_t tid)
+{
+ if (thid == 0)
+ return EINVAL;
+
+ pthread_internal_t* thread = (pthread_internal_t*)thid;
+ thread->kernel_id = tid;
+
+ return 0;
+}
diff --git a/libc/private/bionic_pthread.h b/libc/private/bionic_pthread.h
index 07bcbd4..28d6ad8 100644
--- a/libc/private/bionic_pthread.h
+++ b/libc/private/bionic_pthread.h
@@ -35,6 +35,7 @@ __BEGIN_DECLS
/* Internal, not an NDK API */
extern pid_t __pthread_gettid(pthread_t thid);
+extern int __pthread_settid(pthread_t thid, pid_t tid);
__END_DECLS