static int _rthread_init(void) { pthread_t thread = &_initial_thread; extern int __isthreaded; thread->tid = getthrid(); thread->donesem.lock = _SPINLOCK_UNLOCKED; thread->flags |= THREAD_CANCEL_ENABLE|THREAD_CANCEL_DEFERRED; thread->flags_lock = _SPINLOCK_UNLOCKED; strlcpy(thread->name, "Main process", sizeof(thread->name)); LIST_INSERT_HEAD(&_thread_list, thread, threads); if (_rthread_open_kqueue()) return (errno); _rthread_debug_init(); _rthread_debug(1, "rthread init\n"); _threads_ready = 1; __isthreaded = 1; #if defined(__ELF__) && defined(PIC) /* * To avoid recursion problems in ld.so, we need to trigger the * functions once to fully bind them before registering them * for use. */ _rthread_dl_lock(0); _rthread_dl_lock(1); _rthread_bind_lock(0); _rthread_bind_lock(1); dlctl(NULL, DL_SETTHREADLCK, _rthread_dl_lock); dlctl(NULL, DL_SETBINDLCK, _rthread_bind_lock); #endif return (0); }
void _pthreadinit(void) { __isthreaded = 1; dlctl(nil, DL_SETTHREADLCK, _thread_dl_lock); signal(SIGUSR2, sigusr2handler); }