diff options
author | davidxu <davidxu@FreeBSD.org> | 2003-08-18 03:58:29 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2003-08-18 03:58:29 +0000 |
commit | 3203dde90e7e2cb93d8cfb8292002c02bd4a32d7 (patch) | |
tree | e6cd1320cfc169c79d0f276a0d69df8a3e83fcd4 /lib/libpthread/thread/thr_kern.c | |
parent | cb79c715dd08db9a90224825647fda99a740a31f (diff) | |
download | FreeBSD-src-3203dde90e7e2cb93d8cfb8292002c02bd4a32d7.zip FreeBSD-src-3203dde90e7e2cb93d8cfb8292002c02bd4a32d7.tar.gz |
Treat initial thread as scope system thread when KSE mode is not activated
yet, so we can protect some locking code from being interrupted by signal
handling. When KSE mode is turned on, reset the thread flag to scope process
except we are running in 1:1 mode which we needn't turn it off.
Also remove some unused member variables in structure kse.
Tested by: deischen
Diffstat (limited to 'lib/libpthread/thread/thr_kern.c')
-rw-r--r-- | lib/libpthread/thread/thr_kern.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c index ae151d7..33b4c54 100644 --- a/lib/libpthread/thread/thr_kern.c +++ b/lib/libpthread/thread/thr_kern.c @@ -411,6 +411,9 @@ _kse_setthreaded(int threaded) sigset_t sigset; if ((threaded != 0) && (__isthreaded == 0)) { + SIGFILLSET(sigset); + __sys_sigprocmask(SIG_SETMASK, &sigset, &_thr_initial->sigmask); + /* * Tell the kernel to create a KSE for the initial thread * and enable upcalls in it. @@ -425,10 +428,11 @@ _kse_setthreaded(int threaded) _tcb_set(_kse_initial->k_kcb, _thr_initial->tcb); KSE_SET_MBOX(_kse_initial, _thr_initial); _kse_initial->k_kcb->kcb_kmbx.km_flags |= KMF_BOUND; +#else + _thr_initial->attr.flags &= ~PTHREAD_SCOPE_SYSTEM; + _kse_initial->k_kseg->kg_flags &= ~KGF_SINGLE_THREAD; + _kse_initial->k_kcb->kcb_kmbx.km_curthread = NULL; #endif - SIGFILLSET(sigset); - __sys_sigprocmask(SIG_SETMASK, &sigset, &_thr_initial->sigmask); - _thr_signal_init(); /* * Locking functions in libc are required when there are @@ -963,12 +967,6 @@ kse_sched_multi(struct kse_mailbox *kmbx) */ _tcb_set(curkse->k_kcb, NULL); - /* This may have returned from a kse_release(). */ - if (KSE_WAITING(curkse)) { - DBG_MSG("Entered upcall when KSE is waiting."); - KSE_CLEAR_WAIT(curkse); - } - /* If this is an upcall; take the scheduler lock. */ if (curkse->k_switch == 0) KSE_SCHED_LOCK(curkse, curkse->k_kseg); @@ -1156,16 +1154,16 @@ thr_resume_wrapper(int sig, siginfo_t *siginfo, ucontext_t *ucp) { struct pthread *curthread = _get_curthread(); struct kse *curkse; - int ret, err_save = curthread->error; + int ret, err_save = errno; DBG_MSG(">>> sig wrapper\n"); if (curthread->lock_switch) PANIC("thr_resume_wrapper, lock_switch != 0\n"); thr_resume_check(curthread, ucp, NULL); + errno = err_save; _kse_critical_enter(); curkse = _get_curkse(); curthread->tcb->tcb_tmbx.tm_context = *ucp; - curthread->error = err_save; ret = _thread_switch(curkse->k_kcb, curthread->tcb, 1); if (ret != 0) PANIC("thr_resume_wrapper: thread has returned " @@ -2290,11 +2288,7 @@ kse_reinit(struct kse *kse, int sys_scope) kse->k_kseg = 0; kse->k_schedq = 0; kse->k_locklevel = 0; - SIGEMPTYSET(kse->k_sigmask); - bzero(&kse->k_sigq, sizeof(kse->k_sigq)); - kse->k_check_sigq = 0; kse->k_flags = 0; - kse->k_waiting = 0; kse->k_idle = 0; kse->k_error = 0; kse->k_cpu = 0; |