Changeset View
Changeset View
Standalone View
Standalone View
lib/libthr/thread/thr_init.c
Show First 20 Lines • Show All 197 Lines • ▼ Show 20 Lines | |||||
/* Pull in all symbols required by libthread_db */ | /* Pull in all symbols required by libthread_db */ | ||||
STATIC_LIB_REQUIRE(_thread_state_running); | STATIC_LIB_REQUIRE(_thread_state_running); | ||||
#define DUAL_ENTRY(entry) \ | #define DUAL_ENTRY(entry) \ | ||||
(pthread_func_t)entry, (pthread_func_t)entry | (pthread_func_t)entry, (pthread_func_t)entry | ||||
static pthread_func_t jmp_table[][2] = { | static pthread_func_t jmp_table[][2] = { | ||||
{DUAL_ENTRY(_pthread_atfork)}, /* PJT_ATFORK */ | [PJT_ATFORK] = {DUAL_ENTRY(_thr_atfork)}, | ||||
{DUAL_ENTRY(_pthread_attr_destroy)}, /* PJT_ATTR_DESTROY */ | [PJT_ATTR_DESTROY] = {DUAL_ENTRY(_thr_attr_destroy)}, | ||||
{DUAL_ENTRY(_pthread_attr_getdetachstate)}, /* PJT_ATTR_GETDETACHSTATE */ | [PJT_ATTR_GETDETACHSTATE] = {DUAL_ENTRY(_thr_attr_getdetachstate)}, | ||||
{DUAL_ENTRY(_pthread_attr_getguardsize)}, /* PJT_ATTR_GETGUARDSIZE */ | [PJT_ATTR_GETGUARDSIZE] = {DUAL_ENTRY(_thr_attr_getguardsize)}, | ||||
{DUAL_ENTRY(_pthread_attr_getinheritsched)}, /* PJT_ATTR_GETINHERITSCHED */ | [PJT_ATTR_GETINHERITSCHED] = {DUAL_ENTRY(_thr_attr_getinheritsched)}, | ||||
{DUAL_ENTRY(_pthread_attr_getschedparam)}, /* PJT_ATTR_GETSCHEDPARAM */ | [PJT_ATTR_GETSCHEDPARAM] = {DUAL_ENTRY(_thr_attr_getschedparam)}, | ||||
{DUAL_ENTRY(_pthread_attr_getschedpolicy)}, /* PJT_ATTR_GETSCHEDPOLICY */ | [PJT_ATTR_GETSCHEDPOLICY] = {DUAL_ENTRY(_thr_attr_getschedpolicy)}, | ||||
{DUAL_ENTRY(_pthread_attr_getscope)}, /* PJT_ATTR_GETSCOPE */ | [PJT_ATTR_GETSCOPE] = {DUAL_ENTRY(_thr_attr_getscope)}, | ||||
{DUAL_ENTRY(_pthread_attr_getstackaddr)}, /* PJT_ATTR_GETSTACKADDR */ | [PJT_ATTR_GETSTACKADDR] = {DUAL_ENTRY(_thr_attr_getstackaddr)}, | ||||
{DUAL_ENTRY(_pthread_attr_getstacksize)}, /* PJT_ATTR_GETSTACKSIZE */ | [PJT_ATTR_GETSTACKSIZE] = {DUAL_ENTRY(_thr_attr_getstacksize)}, | ||||
{DUAL_ENTRY(_pthread_attr_init)}, /* PJT_ATTR_INIT */ | [PJT_ATTR_INIT] = {DUAL_ENTRY(_thr_attr_init)}, | ||||
{DUAL_ENTRY(_pthread_attr_setdetachstate)}, /* PJT_ATTR_SETDETACHSTATE */ | [PJT_ATTR_SETDETACHSTATE] = {DUAL_ENTRY(_thr_attr_setdetachstate)}, | ||||
{DUAL_ENTRY(_pthread_attr_setguardsize)}, /* PJT_ATTR_SETGUARDSIZE */ | [PJT_ATTR_SETGUARDSIZE] = {DUAL_ENTRY(_thr_attr_setguardsize)}, | ||||
{DUAL_ENTRY(_pthread_attr_setinheritsched)}, /* PJT_ATTR_SETINHERITSCHED */ | [PJT_ATTR_SETINHERITSCHED] = {DUAL_ENTRY(_thr_attr_setinheritsched)}, | ||||
{DUAL_ENTRY(_pthread_attr_setschedparam)}, /* PJT_ATTR_SETSCHEDPARAM */ | [PJT_ATTR_SETSCHEDPARAM] = {DUAL_ENTRY(_thr_attr_setschedparam)}, | ||||
{DUAL_ENTRY(_pthread_attr_setschedpolicy)}, /* PJT_ATTR_SETSCHEDPOLICY */ | [PJT_ATTR_SETSCHEDPOLICY] = {DUAL_ENTRY(_thr_attr_setschedpolicy)}, | ||||
{DUAL_ENTRY(_pthread_attr_setscope)}, /* PJT_ATTR_SETSCOPE */ | [PJT_ATTR_SETSCOPE] = {DUAL_ENTRY(_thr_attr_setscope)}, | ||||
{DUAL_ENTRY(_pthread_attr_setstackaddr)}, /* PJT_ATTR_SETSTACKADDR */ | [PJT_ATTR_SETSTACKADDR] = {DUAL_ENTRY(_thr_attr_setstackaddr)}, | ||||
{DUAL_ENTRY(_pthread_attr_setstacksize)}, /* PJT_ATTR_SETSTACKSIZE */ | [PJT_ATTR_SETSTACKSIZE] = {DUAL_ENTRY(_thr_attr_setstacksize)}, | ||||
{DUAL_ENTRY(_pthread_cancel)}, /* PJT_CANCEL */ | [PJT_CANCEL] = {DUAL_ENTRY(_thr_cancel)}, | ||||
{DUAL_ENTRY(_pthread_cleanup_pop)}, /* PJT_CLEANUP_POP */ | [PJT_CLEANUP_POP] = {DUAL_ENTRY(_thr_cleanup_pop)}, | ||||
{DUAL_ENTRY(_pthread_cleanup_push)}, /* PJT_CLEANUP_PUSH */ | [PJT_CLEANUP_PUSH] = {DUAL_ENTRY(_thr_cleanup_push)}, | ||||
{DUAL_ENTRY(_pthread_cond_broadcast)}, /* PJT_COND_BROADCAST */ | [PJT_COND_BROADCAST] = {DUAL_ENTRY(_thr_cond_broadcast)}, | ||||
{DUAL_ENTRY(_pthread_cond_destroy)}, /* PJT_COND_DESTROY */ | [PJT_COND_DESTROY] = {DUAL_ENTRY(_thr_cond_destroy)}, | ||||
{DUAL_ENTRY(_pthread_cond_init)}, /* PJT_COND_INIT */ | [PJT_COND_INIT] = {DUAL_ENTRY(_thr_cond_init)}, | ||||
{DUAL_ENTRY(_pthread_cond_signal)}, /* PJT_COND_SIGNAL */ | [PJT_COND_SIGNAL] = {DUAL_ENTRY(_thr_cond_signal)}, | ||||
{DUAL_ENTRY(_pthread_cond_timedwait)}, /* PJT_COND_TIMEDWAIT */ | [PJT_COND_TIMEDWAIT] = {DUAL_ENTRY(_thr_cond_timedwait)}, | ||||
{(pthread_func_t)__pthread_cond_wait, | [PJT_COND_WAIT] = {(pthread_func_t)__thr_cond_wait, | ||||
(pthread_func_t)_pthread_cond_wait}, /* PJT_COND_WAIT */ | (pthread_func_t)_thr_cond_wait}, | ||||
{DUAL_ENTRY(_pthread_detach)}, /* PJT_DETACH */ | [PJT_DETACH] = {DUAL_ENTRY(_thr_detach)}, | ||||
{DUAL_ENTRY(_pthread_equal)}, /* PJT_EQUAL */ | [PJT_EQUAL] = {DUAL_ENTRY(_thr_equal)}, | ||||
{DUAL_ENTRY(_pthread_exit)}, /* PJT_EXIT */ | [PJT_EXIT] = {DUAL_ENTRY(_thr_exit)}, | ||||
{DUAL_ENTRY(_pthread_getspecific)}, /* PJT_GETSPECIFIC */ | [PJT_GETSPECIFIC] = {DUAL_ENTRY(_thr_getspecific)}, | ||||
{DUAL_ENTRY(_pthread_join)}, /* PJT_JOIN */ | [PJT_JOIN] = {DUAL_ENTRY(_thr_join)}, | ||||
{DUAL_ENTRY(_pthread_key_create)}, /* PJT_KEY_CREATE */ | [PJT_KEY_CREATE] = {DUAL_ENTRY(_thr_key_create)}, | ||||
{DUAL_ENTRY(_pthread_key_delete)}, /* PJT_KEY_DELETE*/ | [PJT_KEY_DELETE] = {DUAL_ENTRY(_thr_key_delete)}, | ||||
{DUAL_ENTRY(_pthread_kill)}, /* PJT_KILL */ | [PJT_KILL] = {DUAL_ENTRY(_thr_kill)}, | ||||
arichardson: Actually we might get the same problem as for `_thr_self` here since there is a `thr_kill`… | |||||
kibAuthorUnsubmitted Done Inline ActionsAnd thr_exit. kib: And thr_exit. | |||||
{DUAL_ENTRY(_pthread_main_np)}, /* PJT_MAIN_NP */ | [PJT_MAIN_NP] = {DUAL_ENTRY(_thr_main_np)}, | ||||
{DUAL_ENTRY(_pthread_mutexattr_destroy)}, /* PJT_MUTEXATTR_DESTROY */ | [PJT_MUTEXATTR_DESTROY] = {DUAL_ENTRY(_thr_mutexattr_destroy)}, | ||||
{DUAL_ENTRY(_pthread_mutexattr_init)}, /* PJT_MUTEXATTR_INIT */ | [PJT_MUTEXATTR_INIT] = {DUAL_ENTRY(_thr_mutexattr_init)}, | ||||
{DUAL_ENTRY(_pthread_mutexattr_settype)}, /* PJT_MUTEXATTR_SETTYPE */ | [PJT_MUTEXATTR_SETTYPE] = {DUAL_ENTRY(_thr_mutexattr_settype)}, | ||||
{DUAL_ENTRY(_pthread_mutex_destroy)}, /* PJT_MUTEX_DESTROY */ | [PJT_MUTEX_DESTROY] = {DUAL_ENTRY(_thr_mutex_destroy)}, | ||||
{DUAL_ENTRY(_pthread_mutex_init)}, /* PJT_MUTEX_INIT */ | [PJT_MUTEX_INIT] = {DUAL_ENTRY(__Tthr_mutex_init)}, | ||||
{(pthread_func_t)__pthread_mutex_lock, | [PJT_MUTEX_LOCK] = {DUAL_ENTRY(__Tthr_mutex_lock)}, | ||||
(pthread_func_t)_pthread_mutex_lock}, /* PJT_MUTEX_LOCK */ | [PJT_MUTEX_TRYLOCK] = {DUAL_ENTRY(__Tthr_mutex_trylock)}, | ||||
{(pthread_func_t)__pthread_mutex_trylock, | [PJT_MUTEX_UNLOCK] = {DUAL_ENTRY(_thr_mutex_unlock)}, | ||||
(pthread_func_t)_pthread_mutex_trylock},/* PJT_MUTEX_TRYLOCK */ | [PJT_ONCE] = {DUAL_ENTRY(_thr_once)}, | ||||
{DUAL_ENTRY(_pthread_mutex_unlock)}, /* PJT_MUTEX_UNLOCK */ | [PJT_RWLOCK_DESTROY] = {DUAL_ENTRY(_thr_rwlock_destroy)}, | ||||
{DUAL_ENTRY(_pthread_once)}, /* PJT_ONCE */ | [PJT_RWLOCK_INIT] = {DUAL_ENTRY(_thr_rwlock_init)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_destroy)}, /* PJT_RWLOCK_DESTROY */ | [PJT_RWLOCK_RDLOCK] = {DUAL_ENTRY(_Tthr_rwlock_rdlock)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_init)}, /* PJT_RWLOCK_INIT */ | [PJT_RWLOCK_TRYRDLOCK] = {DUAL_ENTRY(_Tthr_rwlock_tryrdlock)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_rdlock)}, /* PJT_RWLOCK_RDLOCK */ | [PJT_RWLOCK_TRYWRLOCK] = {DUAL_ENTRY(_Tthr_rwlock_trywrlock)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_tryrdlock)},/* PJT_RWLOCK_TRYRDLOCK */ | [PJT_RWLOCK_UNLOCK] = {DUAL_ENTRY(_Tthr_rwlock_unlock)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_trywrlock)},/* PJT_RWLOCK_TRYWRLOCK */ | [PJT_RWLOCK_WRLOCK] = {DUAL_ENTRY(_Tthr_rwlock_wrlock)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_unlock)}, /* PJT_RWLOCK_UNLOCK */ | [PJT_SELF] = {DUAL_ENTRY(_Tthr_self)}, | ||||
{DUAL_ENTRY(_pthread_rwlock_wrlock)}, /* PJT_RWLOCK_WRLOCK */ | [PJT_SETCANCELSTATE] = {DUAL_ENTRY(_thr_setcancelstate)}, | ||||
{DUAL_ENTRY(_pthread_self)}, /* PJT_SELF */ | [PJT_SETCANCELTYPE] = {DUAL_ENTRY(_thr_setcanceltype)}, | ||||
{DUAL_ENTRY(_pthread_setcancelstate)}, /* PJT_SETCANCELSTATE */ | [PJT_SETSPECIFIC] = {DUAL_ENTRY(_thr_setspecific)}, | ||||
{DUAL_ENTRY(_pthread_setcanceltype)}, /* PJT_SETCANCELTYPE */ | [PJT_SIGMASK] = {DUAL_ENTRY(_thr_sigmask)}, | ||||
{DUAL_ENTRY(_pthread_setspecific)}, /* PJT_SETSPECIFIC */ | [PJT_TESTCANCEL] = {DUAL_ENTRY(_Tthr_testcancel)}, | ||||
{DUAL_ENTRY(_pthread_sigmask)}, /* PJT_SIGMASK */ | [PJT_CLEANUP_POP_IMP] = {DUAL_ENTRY(__thr_cleanup_pop_imp)}, | ||||
{DUAL_ENTRY(_pthread_testcancel)}, /* PJT_TESTCANCEL */ | [PJT_CLEANUP_PUSH_IMP] = {DUAL_ENTRY(__thr_cleanup_push_imp)}, | ||||
{DUAL_ENTRY(__pthread_cleanup_pop_imp)},/* PJT_CLEANUP_POP_IMP */ | [PJT_CANCEL_ENTER] = {DUAL_ENTRY(_thr_cancel_enter)}, | ||||
{DUAL_ENTRY(__pthread_cleanup_push_imp)},/* PJT_CLEANUP_PUSH_IMP */ | [PJT_CANCEL_LEAVE] = {DUAL_ENTRY(_thr_cancel_leave)}, | ||||
{DUAL_ENTRY(_pthread_cancel_enter)}, /* PJT_CANCEL_ENTER */ | [PJT_MUTEX_CONSISTENT] = {DUAL_ENTRY(_Tthr_mutex_consistent)}, | ||||
{DUAL_ENTRY(_pthread_cancel_leave)}, /* PJT_CANCEL_LEAVE */ | [PJT_MUTEXATTR_GETROBUST] = {DUAL_ENTRY(_thr_mutexattr_getrobust)}, | ||||
{DUAL_ENTRY(_pthread_mutex_consistent)},/* PJT_MUTEX_CONSISTENT */ | [PJT_MUTEXATTR_SETROBUST] = {DUAL_ENTRY(_thr_mutexattr_setrobust)}, | ||||
{DUAL_ENTRY(_pthread_mutexattr_getrobust)},/* PJT_MUTEXATTR_GETROBUST */ | [PJT_GETTHREADID_NP] = {DUAL_ENTRY(_thr_getthreadid_np)}, | ||||
{DUAL_ENTRY(_pthread_mutexattr_setrobust)},/* PJT_MUTEXATTR_SETROBUST */ | |||||
{DUAL_ENTRY(_pthread_getthreadid_np)}, /* PJT_GETTHREADID_NP */ | |||||
}; | }; | ||||
static int init_once = 0; | static int init_once = 0; | ||||
/* | /* | ||||
* For the shared version of the threads library, the above is sufficient. | * For the shared version of the threads library, the above is sufficient. | ||||
* But for the archive version of the library, we need a little bit more. | * But for the archive version of the library, we need a little bit more. | ||||
* Namely, we must arrange for this particular module to be pulled in from | * Namely, we must arrange for this particular module to be pulled in from | ||||
▲ Show 20 Lines • Show All 216 Lines • Show Last 20 Lines |
Actually we might get the same problem as for _thr_self here since there is a thr_kill syscall?