PERFORCE change 65514 for review
David Xu
davidxu at FreeBSD.org
Fri Nov 19 20:40:04 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=65514
Change 65514 by davidxu at davidxu_alona on 2004/11/20 04:39:52
let kernel do signal work.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigaltstack.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigmask.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigpending.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigsuspend.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigwait.c#2 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigaltstack.c#2 (text+ko) ====
@@ -34,74 +34,7 @@
__weak_reference(_sigaltstack, sigaltstack);
int
-_sigaltstack(stack_t *_ss, stack_t *_oss)
+_sigaltstack(stack_t *ss, stack_t *oss)
{
- struct pthread *curthread = _get_curthread();
- stack_t ss, oss;
- int oonstack, errsave, ret;
- kse_critical_t crit;
-
- if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) {
- crit = _kse_critical_enter();
- ret = __sys_sigaltstack(_ss, _oss);
- errsave = errno;
- /* Get a copy */
- if (ret == 0 && _ss != NULL)
- curthread->sigstk = *_ss;
- _kse_critical_leave(crit);
- errno = errsave;
- return (ret);
- }
-
- if (_ss)
- ss = *_ss;
- if (_oss)
- oss = *_oss;
-
- /* Should get and set stack in atomic way */
- crit = _kse_critical_enter();
- oonstack = _thr_sigonstack(&ss);
- if (_oss != NULL) {
- oss = curthread->sigstk;
- oss.ss_flags = (curthread->sigstk.ss_flags & SS_DISABLE)
- ? SS_DISABLE : ((oonstack) ? SS_ONSTACK : 0);
- }
-
- if (_ss != NULL) {
- if (oonstack) {
- _kse_critical_leave(crit);
- errno = EPERM;
- return (-1);
- }
- if ((ss.ss_flags & ~SS_DISABLE) != 0) {
- _kse_critical_leave(crit);
- errno = EINVAL;
- return (-1);
- }
- if (!(ss.ss_flags & SS_DISABLE)) {
- if (ss.ss_size < MINSIGSTKSZ) {
- _kse_critical_leave(crit);
- errno = ENOMEM;
- return (-1);
- }
- curthread->sigstk = ss;
- } else {
- curthread->sigstk.ss_flags |= SS_DISABLE;
- }
- }
- _kse_critical_leave(crit);
- if (_oss != NULL)
- *_oss = oss;
- return (0);
+ return (__sys_sigaltstack(ss, oss));
}
-
-int
-_thr_sigonstack(void *sp)
-{
- struct pthread *curthread = _get_curthread();
-
- return ((curthread->sigstk.ss_flags & SS_DISABLE) == 0 ?
- (((size_t)sp - (size_t)curthread->sigstk.ss_sp) < curthread->sigstk.ss_size)
- : 0);
-}
-
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigmask.c#2 (text+ko) ====
@@ -46,68 +46,12 @@
_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
{
struct pthread *curthread = _get_curthread();
- sigset_t oldset, newset;
int ret;
- if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) {
- ret = __sys_sigprocmask(how, set, oset);
- if (ret != 0)
- ret = errno;
- /* Get a fresh copy */
- __sys_sigprocmask(SIG_SETMASK, NULL, &curthread->sigmask);
- return (ret);
- }
-
- if (set)
- newset = *set;
-
- THR_SCHED_LOCK(curthread, curthread);
-
- ret = 0;
- if (oset != NULL)
- /* Return the current mask: */
- oldset = curthread->sigmask;
-
- /* Check if a new signal set was provided by the caller: */
- if (set != NULL) {
- /* Process according to what to do: */
- switch (how) {
- /* Block signals: */
- case SIG_BLOCK:
- /* Add signals to the existing mask: */
- SIGSETOR(curthread->sigmask, newset);
- break;
-
- /* Unblock signals: */
- case SIG_UNBLOCK:
- /* Clear signals from the existing mask: */
- SIGSETNAND(curthread->sigmask, newset);
- break;
-
- /* Set the signal process mask: */
- case SIG_SETMASK:
- /* Set the new mask: */
- curthread->sigmask = newset;
- break;
-
- /* Trap invalid actions: */
- default:
- /* Return an invalid argument: */
- ret = EINVAL;
- break;
- }
- SIG_CANTMASK(curthread->sigmask);
- THR_SCHED_UNLOCK(curthread, curthread);
-
- /*
- * Run down any pending signals:
- */
- if (ret == 0)
- _thr_sig_check_pending(curthread);
- } else
- THR_SCHED_UNLOCK(curthread, curthread);
-
- if (ret == 0 && oset != NULL)
- *oset = oldset;
+ ret = __sys_sigprocmask(how, set, oset);
+ if (ret != 0)
+ ret = errno;
+ /* Get a fresh copy */
+ __sys_sigprocmask(SIG_SETMASK, NULL, &curthread->sigmask);
return (ret);
}
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigpending.c#2 (text+ko) ====
@@ -44,30 +44,5 @@
int
_sigpending(sigset_t *set)
{
- struct pthread *curthread = _get_curthread();
- kse_critical_t crit;
- sigset_t sigset;
- int ret = 0;
-
- /* Check for a null signal set pointer: */
- if (set == NULL) {
- /* Return an invalid argument: */
- ret = EINVAL;
- }
- else {
- if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM)
- return (__sys_sigpending(set));
-
- crit = _kse_critical_enter();
- KSE_SCHED_LOCK(curthread->kse, curthread->kseg);
- sigset = curthread->sigpend;
- KSE_SCHED_UNLOCK(curthread->kse, curthread->kseg);
- KSE_LOCK_ACQUIRE(curthread->kse, &_thread_signal_lock);
- SIGSETOR(sigset, _thr_proc_sigpending);
- KSE_LOCK_RELEASE(curthread->kse, &_thread_signal_lock);
- _kse_critical_leave(crit);
- *set = sigset;
- }
- /* Return the completion status: */
- return (ret);
+ return (__sys_sigpending(set));
}
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigsuspend.c#2 (text+ko) ====
@@ -41,59 +41,13 @@
__weak_reference(__sigsuspend, sigsuspend);
int
-_sigsuspend(const sigset_t *set)
-{
- struct pthread *curthread = _get_curthread();
- sigset_t oldmask, newmask, tempset;
- int ret = -1;
-
- if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM)
- return (__sys_sigsuspend(set));
-
- /* Check if a new signal set was provided by the caller: */
- if (set != NULL) {
- newmask = *set;
- SIG_CANTMASK(newmask);
- THR_LOCK_SWITCH(curthread);
-
- /* Save current sigmask: */
- oldmask = curthread->sigmask;
- curthread->oldsigmask = &oldmask;
-
- /* Change the caller's mask: */
- curthread->sigmask = newmask;
- tempset = curthread->sigpend;
- SIGSETNAND(tempset, newmask);
- if (SIGISEMPTY(tempset)) {
- THR_SET_STATE(curthread, PS_SIGSUSPEND);
- /* Wait for a signal: */
- _thr_sched_switch_unlocked(curthread);
- } else {
- THR_UNLOCK_SWITCH(curthread);
- /* check pending signal I can handle: */
- _thr_sig_check_pending(curthread);
- }
- THR_ASSERT(curthread->oldsigmask == NULL,
- "oldsigmask is not cleared");
- /* Always return an interrupted error: */
- errno = EINTR;
- } else {
- /* Return an invalid argument error: */
- errno = EINVAL;
- }
-
- /* Return the completion status: */
- return (ret);
-}
-
-int
__sigsuspend(const sigset_t * set)
{
struct pthread *curthread = _get_curthread();
int ret;
_thr_cancel_enter(curthread);
- ret = _sigsuspend(set);
+ ret = __sys_sigsuspend(set);
_thr_cancel_leave(curthread, 1);
return (ret);
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sigwait.c#2 (text+ko) ====
@@ -43,93 +43,6 @@
__weak_reference(__sigtimedwait, sigtimedwait);
__weak_reference(__sigwaitinfo, sigwaitinfo);
-static int
-lib_sigtimedwait(const sigset_t *set, siginfo_t *info,
- const struct timespec * timeout)
-{
- struct pthread *curthread = _get_curthread();
- int ret = 0;
- int i;
- struct sigwait_data waitdata;
- sigset_t waitset;
- kse_critical_t crit;
- siginfo_t siginfo;
-
- if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) {
- if (info == NULL)
- info = &siginfo;
- return (__sys_sigtimedwait((sigset_t *)set, info,
- (struct timespec *)timeout));
- }
-
- /*
- * Initialize the set of signals that will be waited on:
- */
- waitset = *set;
-
- /* These signals can't be waited on. */
- SIGDELSET(waitset, SIGKILL);
- SIGDELSET(waitset, SIGSTOP);
-
- /*
- * POSIX says that the _application_ must explicitly install
- * a dummy handler for signals that are SIG_IGN in order
- * to sigwait on them. Note that SIG_IGN signals are left in
- * the mask because a subsequent sigaction could enable an
- * ignored signal.
- */
-
- crit = _kse_critical_enter();
- KSE_SCHED_LOCK(curthread->kse, curthread->kseg);
- for (i = 1; i <= _SIG_MAXSIG; ++i) {
- if (SIGISMEMBER(waitset, i) &&
- SIGISMEMBER(curthread->sigpend, i)) {
- SIGDELSET(curthread->sigpend, i);
- siginfo = curthread->siginfo[i - 1];
- KSE_SCHED_UNLOCK(curthread->kse,
- curthread->kseg);
- _kse_critical_leave(crit);
- ret = i;
- goto OUT;
- }
- }
- curthread->timeout = 0;
- curthread->interrupted = 0;
- _thr_set_timeout(timeout);
- /* Wait for a signal: */
- siginfo.si_signo = 0;
- waitdata.waitset = &waitset;
- waitdata.siginfo = &siginfo;
- curthread->data.sigwait = &waitdata;
- THR_SET_STATE(curthread, PS_SIGWAIT);
- _thr_sched_switch_unlocked(curthread);
- /*
- * Return the signal number to the caller:
- */
- if (siginfo.si_signo > 0) {
- ret = siginfo.si_signo;
- } else {
- if (curthread->interrupted)
- errno = EINTR;
- else if (curthread->timeout)
- errno = EAGAIN;
- ret = -1;
- }
- curthread->timeout = 0;
- curthread->interrupted = 0;
- /*
- * Probably unnecessary, but since it's in a union struct
- * we don't know how it could be used in the future.
- */
- curthread->data.sigwait = NULL;
-
-OUT:
- if (ret > 0 && info != NULL)
- *info = siginfo;
-
- return (ret);
-}
-
int
__sigtimedwait(const sigset_t *set, siginfo_t *info,
const struct timespec * timeout)
@@ -138,15 +51,16 @@
int ret;
_thr_cancel_enter(curthread);
- ret = lib_sigtimedwait(set, info, timeout);
+ ret = __sys_sigtimedwait(set, info, timeout);
_thr_cancel_leave(curthread, 1);
return (ret);
}
-int _sigtimedwait(const sigset_t *set, siginfo_t *info,
+int
+_sigtimedwait(const sigset_t *set, siginfo_t *info,
const struct timespec * timeout)
{
- return lib_sigtimedwait(set, info, timeout);
+ return (__sys_sigtimedwait(set, info, timeout));
}
int
@@ -156,7 +70,7 @@
int ret;
_thr_cancel_enter(curthread);
- ret = lib_sigtimedwait(set, info, NULL);
+ ret = __sys_sigwaitinfo(set, info);
_thr_cancel_leave(curthread, 1);
return (ret);
}
@@ -164,7 +78,7 @@
int
_sigwaitinfo(const sigset_t *set, siginfo_t *info)
{
- return lib_sigtimedwait(set, info, NULL);
+ return (__sys_sigwaitinfo(set, info));
}
int
@@ -174,13 +88,7 @@
int ret;
_thr_cancel_enter(curthread);
- ret = lib_sigtimedwait(set, NULL, NULL);
- if (ret > 0) {
- *sig = ret;
- ret = 0;
- } else {
- ret = errno;
- }
+ ret = __sys_sigwait(set, sig);
_thr_cancel_leave(curthread, 1);
return (ret);
}
@@ -188,15 +96,5 @@
int
_sigwait(const sigset_t *set, int *sig)
{
- int ret;
-
- ret = lib_sigtimedwait(set, NULL, NULL);
- if (ret > 0) {
- *sig = ret;
- ret = 0;
- } else {
- ret = errno;
- }
- return (ret);
+ return __sys_sigwait(set, sig);
}
-
More information about the p4-projects
mailing list