* Applied patch by "v" with minor changes; this allows the posixtestsuite's

pthread_create 2-1 interface conformance test to pass.
* Also fixed return values to be in the POSIX error range in case we ever switch
  them by default.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33775 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-10-26 17:11:02 +00:00
parent b716ef33bf
commit ebcd4e1ada
+16 -6
View File
@@ -64,7 +64,7 @@ pthread_thread_entry(thread_func _unused, void *_thread)
on_exit_thread(pthread_destroy_thread, NULL);
pthread_exit(thread->entry(thread->entry_argument));
return B_OK;
return 0;
}
@@ -129,7 +129,7 @@ pthread_create(pthread_t *_thread, const pthread_attr_t *_attr,
resume_thread(thread->id);
*_thread = thread;
return B_OK;
return 0;
}
@@ -155,6 +155,7 @@ pthread_equal(pthread_t t1, pthread_t t2)
return t1 != NULL && t2 != NULL && t1 == t2;
}
int
pthread_join(pthread_t thread, void **_value)
{
@@ -169,7 +170,7 @@ pthread_join(pthread_t thread, void **_value)
if ((atomic_or(&thread->flags, THREAD_DETACHED) & THREAD_DEAD) != 0)
free(thread);
return error;
return B_TO_POSIX_ERROR(error);
}
@@ -187,9 +188,9 @@ pthread_kill(pthread_t thread, int sig)
status_t status = send_signal(thread->id, (uint)sig);
if (status != B_OK) {
if (status == B_BAD_THREAD_ID)
status = ESRCH;
return ESRCH;
return status;
return B_TO_POSIX_ERROR(status);
}
return 0;
@@ -199,7 +200,16 @@ pthread_kill(pthread_t thread, int sig)
int
pthread_detach(pthread_t thread)
{
if ((atomic_or(&thread->flags, THREAD_DETACHED) & THREAD_DEAD) != 0)
int32 flags;
if (thread == NULL)
return EINVAL;
flags = atomic_or(&thread->flags, THREAD_DETACHED);
if ((flags & THREAD_DETACHED) != 0)
return 0;
if ((flags & THREAD_DEAD) != 0)
free(thread);
return 0;