version 1.144, 2014/01/31 20:44:01 |
version 1.145, 2014/12/16 20:05:54 |
Line 59 __RCSID("$NetBSD$"); |
|
Line 59 __RCSID("$NetBSD$"); |
|
|
|
#include "pthread.h" |
#include "pthread.h" |
#include "pthread_int.h" |
#include "pthread_int.h" |
|
#include "pthread_makelwp.h" |
#include "reentrant.h" |
#include "reentrant.h" |
|
|
pthread_rwlock_t pthread__alltree_lock = PTHREAD_RWLOCK_INITIALIZER; |
pthread_rwlock_t pthread__alltree_lock = PTHREAD_RWLOCK_INITIALIZER; |
Line 464 pthread_create(pthread_t *thread, const |
|
Line 465 pthread_create(pthread_t *thread, const |
|
return ENOMEM; |
return ENOMEM; |
} |
} |
|
|
/* This is used only when creating the thread. */ |
|
_INITCONTEXT_U(&newthread->pt_uc); |
|
newthread->pt_uc.uc_stack = newthread->pt_stack; |
|
newthread->pt_uc.uc_link = NULL; |
|
#if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) |
#if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) |
newthread->pt_tls = NULL; |
newthread->pt_tls = NULL; |
#endif |
#endif |
Line 487 pthread_create(pthread_t *thread, const |
|
Line 484 pthread_create(pthread_t *thread, const |
|
pthread_mutex_unlock(&pthread__deadqueue_lock); |
pthread_mutex_unlock(&pthread__deadqueue_lock); |
return ENOMEM; |
return ENOMEM; |
} |
} |
_INITCONTEXT_U(&newthread->pt_uc); |
|
newthread->pt_uc.uc_stack = newthread->pt_stack; |
|
newthread->pt_uc.uc_link = NULL; |
|
} |
} |
|
|
/* |
/* |
Line 505 pthread_create(pthread_t *thread, const |
|
Line 499 pthread_create(pthread_t *thread, const |
|
private_area = newthread; |
private_area = newthread; |
#endif |
#endif |
|
|
_lwp_makecontext(&newthread->pt_uc, pthread__create_tramp, |
|
newthread, private_area, newthread->pt_stack.ss_sp, |
|
newthread->pt_stack.ss_size); |
|
|
|
flag = LWP_DETACHED; |
flag = LWP_DETACHED; |
if ((newthread->pt_flags & PT_FLAG_SUSPENDED) != 0 || |
if ((newthread->pt_flags & PT_FLAG_SUSPENDED) != 0 || |
(nattr.pta_flags & PT_FLAG_EXPLICIT_SCHED) != 0) |
(nattr.pta_flags & PT_FLAG_EXPLICIT_SCHED) != 0) |
flag |= LWP_SUSPENDED; |
flag |= LWP_SUSPENDED; |
ret = _lwp_create(&newthread->pt_uc, flag, &newthread->pt_lid); |
|
|
ret = pthread__makelwp(pthread__create_tramp, newthread, private_area, |
|
newthread->pt_stack.ss_sp, newthread->pt_stack.ss_size, |
|
flag, &newthread->pt_lid); |
if (ret != 0) { |
if (ret != 0) { |
ret = errno; |
ret = errno; |
pthread_mutex_lock(&newthread->pt_lock); |
pthread_mutex_lock(&newthread->pt_lock); |
Line 1325 pthread__initmain(pthread_t *newt) |
|
Line 1318 pthread__initmain(pthread_t *newt) |
|
4 * pthread__pagesize / 1024); |
4 * pthread__pagesize / 1024); |
|
|
*newt = &pthread__main; |
*newt = &pthread__main; |
#ifdef __HAVE___LWP_GETTCB_FAST |
#if defined(_PTHREAD_GETTCB_EXT) |
|
pthread__main.pt_tls = _PTHREAD_GETTCB_EXT(); |
|
#elif defined(__HAVE___LWP_GETTCB_FAST) |
pthread__main.pt_tls = __lwp_gettcb_fast(); |
pthread__main.pt_tls = __lwp_gettcb_fast(); |
#else |
#else |
pthread__main.pt_tls = _lwp_getprivate(); |
pthread__main.pt_tls = _lwp_getprivate(); |