Fix potential race condition on CTS TC pthread_gettid_np
Root cause:
If start_routine thread exits before pthread_gettid_np is invokded, the "tid" field
will be cleared so that pthread_gettid_np will get "0" (which is cleared by kernel,
due to the flag "CLONE_CHILD_CLEARTID" is set while calling clone system call inside
pthread_create).
Proposed patch:
Use a mutex to guarantee pthread_gettid_np will be invoked and returned before the
start_routine exits
Signed-off-by: Junjie Hu <junjie.hu@mediatek.com>
Change-Id: I22411f1b0f7446d76a0373cef4ccec858fac7018
(cherry picked from commit 4f80102935
)
This commit is contained in:
parent
6209b99a73
commit
de1246202a
7
tests/pthread_test.cpp
Normal file → Executable file
7
tests/pthread_test.cpp
Normal file → Executable file
@ -1303,8 +1303,11 @@ TEST(pthread, pthread_attr_getstack_18908062) {
|
||||
}
|
||||
|
||||
#if defined(__BIONIC__)
|
||||
static pthread_mutex_t gettid_mutex;
|
||||
static void* pthread_gettid_np_helper(void* arg) {
|
||||
pthread_mutex_lock(&gettid_mutex);
|
||||
*reinterpret_cast<pid_t*>(arg) = gettid();
|
||||
pthread_mutex_unlock(&gettid_mutex);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
@ -1315,11 +1318,15 @@ TEST(pthread, pthread_gettid_np) {
|
||||
|
||||
pid_t t_gettid_result;
|
||||
pthread_t t;
|
||||
pthread_mutex_init(&gettid_mutex, NULL);
|
||||
pthread_mutex_lock(&gettid_mutex);
|
||||
pthread_create(&t, NULL, pthread_gettid_np_helper, &t_gettid_result);
|
||||
|
||||
pid_t t_pthread_gettid_np_result = pthread_gettid_np(t);
|
||||
pthread_mutex_unlock(&gettid_mutex);
|
||||
|
||||
pthread_join(t, NULL);
|
||||
pthread_mutex_destroy(&gettid_mutex);
|
||||
|
||||
ASSERT_EQ(t_gettid_result, t_pthread_gettid_np_result);
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user