diff options
| author | David Xu <davidxu@FreeBSD.org> | 2003-09-14 22:42:39 +0000 |
|---|---|---|
| committer | David Xu <davidxu@FreeBSD.org> | 2003-09-14 22:42:39 +0000 |
| commit | 06925cea04771dc48abc6a56daa88112e95d774e (patch) | |
| tree | 32412160b780a53f365168fb7b35a20b71af5bea /lib/libpthread/thread | |
| parent | 89c6390006634e1b739542762e810b0620c8b40d (diff) | |
Notes
Diffstat (limited to 'lib/libpthread/thread')
| -rw-r--r-- | lib/libpthread/thread/thr_sig.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/libpthread/thread/thr_sig.c b/lib/libpthread/thread/thr_sig.c index cda46f1c4e5d..1f1f0b4593dc 100644 --- a/lib/libpthread/thread/thr_sig.c +++ b/lib/libpthread/thread/thr_sig.c @@ -299,6 +299,9 @@ sigprop(int sig) return (0); } +typedef void (*ohandler)(int sig, int code, + struct sigcontext *scp, char *addr, __sighandler_t *catcher); + void _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) { @@ -366,9 +369,11 @@ _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) (sigfunc != (__siginfohandler_t *)_thr_sig_handler)) { if ((sa_flags & SA_SIGINFO) != 0 || info == NULL) (*(sigfunc))(sig, info, ucp); - else - (*(sigfunc))(sig, (siginfo_t*)(intptr_t)info->si_code, - ucp); + else { + ((ohandler)(*sigfunc))( + sig, info->si_code, (struct sigcontext *)ucp, + info->si_addr, (__sighandler_t *)sigfunc); + } } else { if ((__sighandler_t *)sigfunc == SIG_DFL) { if (sigprop(sig) & SA_KILL) { @@ -444,9 +449,11 @@ thr_sig_invoke_handler(struct pthread *curthread, int sig, siginfo_t *info, ((__sighandler_t *)sigfunc != SIG_IGN)) { if ((sa_flags & SA_SIGINFO) != 0 || info == NULL) (*(sigfunc))(sig, info, ucp); - else - (*(sigfunc))(sig, (siginfo_t*)(intptr_t)info->si_code, - ucp); + else { + ((ohandler)(*sigfunc))( + sig, info->si_code, (struct sigcontext *)ucp, + info->si_addr, (__sighandler_t *)sigfunc); + } } else { if ((__sighandler_t *)sigfunc == SIG_DFL) { if (sigprop(sig) & SA_KILL) { |
