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)
|
int pthread_join(pthread_t thid, void ** ret_val)
|
||||||
{
|
{
|
||||||
pthread_internal_t* thread = (pthread_internal_t*)thid;
|
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
|
// check that the thread still exists and is not detached
|
||||||
pthread_mutex_lock(&gThreadListLock);
|
pthread_mutex_lock(&gThreadListLock);
|
||||||
|
|
||||||
for (thread = gThreadList; thread != NULL; thread = thread->next)
|
for (thread = gThreadList; thread != NULL; thread = thread->next) {
|
||||||
if (thread == (pthread_internal_t*)thid)
|
if (thread == (pthread_internal_t*)thid) {
|
||||||
goto FoundIt;
|
goto FoundIt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&gThreadListLock);
|
pthread_mutex_unlock(&gThreadListLock);
|
||||||
return ESRCH;
|
return ESRCH;
|
||||||
@ -658,7 +662,7 @@ FoundIt:
|
|||||||
*
|
*
|
||||||
* otherwise, we need to increment 'join-count' and wait to be signaled
|
* otherwise, we need to increment 'join-count' and wait to be signaled
|
||||||
*/
|
*/
|
||||||
count = thread->join_count;
|
int count = thread->join_count;
|
||||||
if (count >= 0) {
|
if (count >= 0) {
|
||||||
thread->join_count += 1;
|
thread->join_count += 1;
|
||||||
pthread_cond_wait( &thread->join_cond, &gThreadListLock );
|
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(0, pthread_join(t2, &join_result));
|
||||||
ASSERT_EQ(EINVAL, reinterpret_cast<int>(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