Update.
2000-06-10 Ulrich Drepper <drepper@redhat.com> * pthread.c (__pthread_create_2_1): Optimize a bit. * internals.h (invalid_handle): Also test for p_terminated != 0. (nonexisting_handle): New function. Same as old invalid_handle. * join.c (pthread_join): Use nonexisting_handle instead of invalid_handle to test for acceptable thread handle. Reported by Permaine Cheung <pcheung@cygnus.com>.
This commit is contained in:
parent
7e6d380990
commit
ee5d48553a
|
@ -1,3 +1,13 @@
|
||||||
|
2000-06-10 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* pthread.c (__pthread_create_2_1): Optimize a bit.
|
||||||
|
|
||||||
|
* internals.h (invalid_handle): Also test for p_terminated != 0.
|
||||||
|
(nonexisting_handle): New function. Same as old invalid_handle.
|
||||||
|
* join.c (pthread_join): Use nonexisting_handle instead of
|
||||||
|
invalid_handle to test for acceptable thread handle.
|
||||||
|
Reported by Permaine Cheung <pcheung@cygnus.com>.
|
||||||
|
|
||||||
2000-06-08 Ulrich Drepper <drepper@redhat.com>
|
2000-06-08 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/pthread/timer_routines.c (__timer_thread_queue_timer):
|
* sysdeps/pthread/timer_routines.c (__timer_thread_queue_timer):
|
||||||
|
|
|
@ -297,6 +297,11 @@ static inline pthread_handle thread_handle(pthread_t id)
|
||||||
/* Validate a thread handle. Must have acquired h->h_spinlock before. */
|
/* Validate a thread handle. Must have acquired h->h_spinlock before. */
|
||||||
|
|
||||||
static inline int invalid_handle(pthread_handle h, pthread_t id)
|
static inline int invalid_handle(pthread_handle h, pthread_t id)
|
||||||
|
{
|
||||||
|
return h->h_descr == NULL || h->h_descr->p_tid != id || h->h_descr->p_terminated;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int nonexisting_handle(pthread_handle h, pthread_t id)
|
||||||
{
|
{
|
||||||
return h->h_descr == NULL || h->h_descr->p_tid != id;
|
return h->h_descr == NULL || h->h_descr->p_tid != id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@ int pthread_join(pthread_t thread_id, void ** thread_return)
|
||||||
extr.pu_extricate_func = join_extricate_func;
|
extr.pu_extricate_func = join_extricate_func;
|
||||||
|
|
||||||
__pthread_lock(&handle->h_lock, self);
|
__pthread_lock(&handle->h_lock, self);
|
||||||
if (invalid_handle(handle, thread_id)) {
|
if (nonexisting_handle(handle, thread_id)) {
|
||||||
__pthread_unlock(&handle->h_lock);
|
__pthread_unlock(&handle->h_lock);
|
||||||
return ESRCH;
|
return ESRCH;
|
||||||
}
|
}
|
||||||
|
|
|
@ -500,6 +500,7 @@ int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr,
|
||||||
{
|
{
|
||||||
pthread_descr self = thread_self();
|
pthread_descr self = thread_self();
|
||||||
struct pthread_request request;
|
struct pthread_request request;
|
||||||
|
int retval;
|
||||||
if (__pthread_manager_request < 0) {
|
if (__pthread_manager_request < 0) {
|
||||||
if (__pthread_initialize_manager() < 0) return EAGAIN;
|
if (__pthread_initialize_manager() < 0) return EAGAIN;
|
||||||
}
|
}
|
||||||
|
@ -512,9 +513,10 @@ int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr,
|
||||||
&request.req_args.create.mask);
|
&request.req_args.create.mask);
|
||||||
__libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
|
__libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
|
||||||
suspend(self);
|
suspend(self);
|
||||||
if (THREAD_GETMEM(self, p_retcode) == 0)
|
retval = THREAD_GETMEM(self, p_retcode;
|
||||||
|
if (retval == 0)
|
||||||
*thread = (pthread_t) THREAD_GETMEM(self, p_retval);
|
*thread = (pthread_t) THREAD_GETMEM(self, p_retval);
|
||||||
return THREAD_GETMEM(self, p_retcode);
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
|
versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
|
||||||
|
|
Loading…
Reference in New Issue