summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormtm <mtm@FreeBSD.org>2004-03-27 15:05:28 +0000
committermtm <mtm@FreeBSD.org>2004-03-27 15:05:28 +0000
commit1368ee7bbe8fe12cc3198ba6d3b60c72aba57b4c (patch)
tree59962a1a1997ce2f27f3837a246291555fd466ff
parent9481d0539ded5c181074110b4561003edab1a015 (diff)
downloadFreeBSD-src-1368ee7bbe8fe12cc3198ba6d3b60c72aba57b4c.zip
FreeBSD-src-1368ee7bbe8fe12cc3198ba6d3b60c72aba57b4c.tar.gz
o Since we're not using signals for thread synchronization anymore,
sigprocmask no longer needs to be wrapped. o raise(3) is applied to the calling thread in a threaded program. o In the sigaction wrapper reference the correct structure. o Don't treat SIGTHR especially anymore (infact it won't exist in a little while).
-rw-r--r--lib/libthr/thread/thr_sig.c30
-rw-r--r--lib/libthr/thread/thr_syscalls.c21
2 files changed, 17 insertions, 34 deletions
diff --git a/lib/libthr/thread/thr_sig.c b/lib/libthr/thread/thr_sig.c
index 771afbc..0f7d173 100644
--- a/lib/libthr/thread/thr_sig.c
+++ b/lib/libthr/thread/thr_sig.c
@@ -47,36 +47,6 @@
#define DBG_MSG(x...)
#endif
-__weak_reference(_sigprocmask, sigprocmask);
-
-int
-_sigprocmask(int how, const sigset_t *set, sigset_t *oset)
-{
- sigset_t new;
-
- /*
- * Make sure applications can't unblock our synchronization
- * signal. We always want to take this with sigwait().
- */
- if (set != NULL) {
- new = *set;
- switch (how) {
- case SIG_BLOCK:
- case SIG_SETMASK:
- SIGADDSET(new, SIGTHR);
- break;
- case SIG_UNBLOCK:
- SIGDELSET(new, SIGTHR);
- break;
- default:
- break;
- }
- set = &new;
- }
-
- return (__sys_sigprocmask(how, set, oset));
-}
-
__weak_reference(_pthread_sigmask, pthread_sigmask);
int
diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
index badd7cb..2d83ab5 100644
--- a/lib/libthr/thread/thr_syscalls.c
+++ b/lib/libthr/thread/thr_syscalls.c
@@ -272,6 +272,21 @@ pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
return (ret);
}
+__weak_reference(_raise, raise);
+
+int
+_raise(int sig)
+{
+ int error;
+
+ error = pthread_kill(pthread_self(), sig);
+ if (error != 0) {
+ errno = error;
+ error = -1;
+ }
+ return (error);
+}
+
__weak_reference(_read, read);
ssize_t
@@ -324,13 +339,11 @@ _sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
struct sigaction oldact, wrapperact;
int error;
- /* Detect invalid signals. Signal SIGTHR is silently ignored */
+ /* Detect invalid signals. */
if (sig < 1 || sig > NSIG) {
errno = EINVAL;
return (-1);
}
- if (sig == SIGTHR)
- return (0);
/*
* If act is not NULL the library's signal wrapper is passed into the
@@ -348,7 +361,7 @@ _sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
tmpact->sa_handler != SIG_IGN) {
bcopy((const void *)tmpact, (void *)&wrapperact,
sizeof(struct sigaction));
- tmpact->sa_flags &= SA_SIGINFO;
+ wrapperact.sa_flags |= SA_SIGINFO;
wrapperact.sa_sigaction = &_thread_sig_wrapper;
tmpact = &wrapperact;
}
OpenPOWER on IntegriCloud