Merge "Fix the pthread_join on self error case."
This commit is contained in:
commit
4d36b0bd38
@ -633,14 +633,18 @@ void pthread_exit(void * retval)
|
||||
int pthread_join(pthread_t thid, void ** ret_val)
|
||||
{
|
||||
pthread_internal_t* thread = (pthread_internal_t*)thid;
|
||||
int count;
|
||||
if (thid == pthread_self()) {
|
||||
return EDEADLK;
|
||||
}
|
||||
|
||||
// check that the thread still exists and is not detached
|
||||
pthread_mutex_lock(&gThreadListLock);
|
||||
|
||||
for (thread = gThreadList; thread != NULL; thread = thread->next)
|
||||
if (thread == (pthread_internal_t*)thid)
|
||||
for (thread = gThreadList; thread != NULL; thread = thread->next) {
|
||||
if (thread == (pthread_internal_t*)thid) {
|
||||
goto FoundIt;
|
||||
}
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&gThreadListLock);
|
||||
return ESRCH;
|
||||
@ -658,7 +662,7 @@ FoundIt:
|
||||
*
|
||||
* otherwise, we need to increment 'join-count' and wait to be signaled
|
||||
*/
|
||||
count = thread->join_count;
|
||||
int count = thread->join_count;
|
||||
if (count >= 0) {
|
||||
thread->join_count += 1;
|
||||
pthread_cond_wait( &thread->join_cond, &gThreadListLock );
|
||||
|
@ -80,3 +80,8 @@ TEST(pthread, pthread_no_op_detach_after_join) {
|
||||
ASSERT_EQ(0, pthread_join(t2, &join_result));
|
||||
ASSERT_EQ(EINVAL, reinterpret_cast<int>(join_result));
|
||||
}
|
||||
|
||||
TEST(pthread, pthread_join_self) {
|
||||
void* result;
|
||||
ASSERT_EQ(EDEADLK, pthread_join(pthread_self(), &result));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user