Merge "Fix the pthread_join on self error case."

This commit is contained in:
Elliott Hughes 2012-10-29 10:30:15 -07:00 committed by Gerrit Code Review
commit 4d36b0bd38
2 changed files with 13 additions and 4 deletions

View File

@ -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 );

View File

@ -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));
}