When working with sigset_t's, and needing to perform masking operations based
on a process's pending signals, use the signal queue flattener, ksiginfo_to_sigset_t, on the process, and on a local sigset_t, and then work with that as needed.
This commit is contained in:
parent
d0bd8ced91
commit
5cd192f4b2
@ -63,6 +63,7 @@ extern int coda_nc_initialized; /* Set if cache has been initialized */
|
|||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
#include <sys/malloc.h>
|
#include <sys/malloc.h>
|
||||||
#include <sys/file.h> /* must come after sys/malloc.h */
|
#include <sys/file.h> /* must come after sys/malloc.h */
|
||||||
|
#include <sys/ksiginfo.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
@ -491,6 +492,7 @@ coda_call(mntinfo, inSize, outSize, buffer)
|
|||||||
#ifdef CTL_C
|
#ifdef CTL_C
|
||||||
struct thread *td = curthread;
|
struct thread *td = curthread;
|
||||||
struct proc *p = td->td_proc;
|
struct proc *p = td->td_proc;
|
||||||
|
sigset_t pending_set;
|
||||||
sigset_t psig_omask;
|
sigset_t psig_omask;
|
||||||
sigset_t tempset;
|
sigset_t tempset;
|
||||||
int i;
|
int i;
|
||||||
@ -561,18 +563,20 @@ coda_call(mntinfo, inSize, outSize, buffer)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
ksiginfo_to_sigset_t(p, &pending_set);
|
||||||
SIGEMPTYSET(tempset);
|
SIGEMPTYSET(tempset);
|
||||||
SIGADDSET(tempset, SIGIO);
|
SIGADDSET(tempset, SIGIO);
|
||||||
if (SIGSETEQ(p->p_siglist, tempset)) {
|
if (SIGSETEQ(pending_set, tempset)) {
|
||||||
SIGADDSET(p->p_sigmask, SIGIO);
|
SIGADDSET(p->p_sigmask, SIGIO);
|
||||||
#ifdef CODA_VERBOSE
|
#ifdef CODA_VERBOSE
|
||||||
printf("coda_call: tsleep returns %d SIGIO, cnt %d\n",
|
printf("coda_call: tsleep returns %d SIGIO, cnt %d\n",
|
||||||
error, i);
|
error, i);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
ksiginfo_to_sigset_t(p, &pending_set);
|
||||||
SIGDELSET(tempset, SIGIO);
|
SIGDELSET(tempset, SIGIO);
|
||||||
SIGADDSET(tempset, SIGALRM);
|
SIGADDSET(tempset, SIGALRM);
|
||||||
if (SIGSETEQ(p->p_siglist, tempset)) {
|
if (SIGSETEQ(pending_set, tempset)) {
|
||||||
SIGADDSET(p->p_sigmask, SIGALRM);
|
SIGADDSET(p->p_sigmask, SIGALRM);
|
||||||
#ifdef CODA_VERBOSE
|
#ifdef CODA_VERBOSE
|
||||||
printf("coda_call: tsleep returns %d SIGALRM, cnt %d\n",
|
printf("coda_call: tsleep returns %d SIGALRM, cnt %d\n",
|
||||||
@ -584,17 +588,17 @@ coda_call(mntinfo, inSize, outSize, buffer)
|
|||||||
error, i);
|
error, i);
|
||||||
|
|
||||||
#if notyet
|
#if notyet
|
||||||
tempset = p->p_siglist;
|
tempset = pending_set;
|
||||||
SIGSETNAND(tempset, p->p_sigmask);
|
SIGSETNAND(tempset, p->p_sigmask);
|
||||||
printf("coda_call: siglist = %p, sigmask = %p, mask %p\n",
|
printf("coda_call: siglist = %p, sigmask = %p, mask %p\n",
|
||||||
p->p_siglist, p->p_sigmask,
|
pending_set, p->p_sigmask,
|
||||||
tempset);
|
tempset);
|
||||||
break;
|
break;
|
||||||
SIGSETOR(p->p_sigmask, p->p_siglist);
|
SIGSETOR(p->p_sigmask, pending_set);
|
||||||
tempset = p->p_siglist;
|
tempset = pending_set;
|
||||||
SIGSETNAND(tempset, p->p_sigmask);
|
SIGSETNAND(tempset, p->p_sigmask);
|
||||||
printf("coda_call: new mask, siglist = %p, sigmask = %p, mask %p\n",
|
printf("coda_call: new mask, siglist = %p, sigmask = %p, mask %p\n",
|
||||||
p->p_siglist, p->p_sigmask,
|
pending_set, p->p_sigmask,
|
||||||
tempset);
|
tempset);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,7 @@ extern int coda_nc_initialized; /* Set if cache has been initialized */
|
|||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
#include <sys/malloc.h>
|
#include <sys/malloc.h>
|
||||||
#include <sys/file.h> /* must come after sys/malloc.h */
|
#include <sys/file.h> /* must come after sys/malloc.h */
|
||||||
|
#include <sys/ksiginfo.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
@ -491,6 +492,7 @@ coda_call(mntinfo, inSize, outSize, buffer)
|
|||||||
#ifdef CTL_C
|
#ifdef CTL_C
|
||||||
struct thread *td = curthread;
|
struct thread *td = curthread;
|
||||||
struct proc *p = td->td_proc;
|
struct proc *p = td->td_proc;
|
||||||
|
sigset_t pending_set;
|
||||||
sigset_t psig_omask;
|
sigset_t psig_omask;
|
||||||
sigset_t tempset;
|
sigset_t tempset;
|
||||||
int i;
|
int i;
|
||||||
@ -561,18 +563,20 @@ coda_call(mntinfo, inSize, outSize, buffer)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
ksiginfo_to_sigset_t(p, &pending_set);
|
||||||
SIGEMPTYSET(tempset);
|
SIGEMPTYSET(tempset);
|
||||||
SIGADDSET(tempset, SIGIO);
|
SIGADDSET(tempset, SIGIO);
|
||||||
if (SIGSETEQ(p->p_siglist, tempset)) {
|
if (SIGSETEQ(pending_set, tempset)) {
|
||||||
SIGADDSET(p->p_sigmask, SIGIO);
|
SIGADDSET(p->p_sigmask, SIGIO);
|
||||||
#ifdef CODA_VERBOSE
|
#ifdef CODA_VERBOSE
|
||||||
printf("coda_call: tsleep returns %d SIGIO, cnt %d\n",
|
printf("coda_call: tsleep returns %d SIGIO, cnt %d\n",
|
||||||
error, i);
|
error, i);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
ksiginfo_to_sigset_t(p, &pending_set);
|
||||||
SIGDELSET(tempset, SIGIO);
|
SIGDELSET(tempset, SIGIO);
|
||||||
SIGADDSET(tempset, SIGALRM);
|
SIGADDSET(tempset, SIGALRM);
|
||||||
if (SIGSETEQ(p->p_siglist, tempset)) {
|
if (SIGSETEQ(pending_set, tempset)) {
|
||||||
SIGADDSET(p->p_sigmask, SIGALRM);
|
SIGADDSET(p->p_sigmask, SIGALRM);
|
||||||
#ifdef CODA_VERBOSE
|
#ifdef CODA_VERBOSE
|
||||||
printf("coda_call: tsleep returns %d SIGALRM, cnt %d\n",
|
printf("coda_call: tsleep returns %d SIGALRM, cnt %d\n",
|
||||||
@ -584,17 +588,17 @@ coda_call(mntinfo, inSize, outSize, buffer)
|
|||||||
error, i);
|
error, i);
|
||||||
|
|
||||||
#if notyet
|
#if notyet
|
||||||
tempset = p->p_siglist;
|
tempset = pending_set;
|
||||||
SIGSETNAND(tempset, p->p_sigmask);
|
SIGSETNAND(tempset, p->p_sigmask);
|
||||||
printf("coda_call: siglist = %p, sigmask = %p, mask %p\n",
|
printf("coda_call: siglist = %p, sigmask = %p, mask %p\n",
|
||||||
p->p_siglist, p->p_sigmask,
|
pending_set, p->p_sigmask,
|
||||||
tempset);
|
tempset);
|
||||||
break;
|
break;
|
||||||
SIGSETOR(p->p_sigmask, p->p_siglist);
|
SIGSETOR(p->p_sigmask, pending_set);
|
||||||
tempset = p->p_siglist;
|
tempset = pending_set;
|
||||||
SIGSETNAND(tempset, p->p_sigmask);
|
SIGSETNAND(tempset, p->p_sigmask);
|
||||||
printf("coda_call: new mask, siglist = %p, sigmask = %p, mask %p\n",
|
printf("coda_call: new mask, siglist = %p, sigmask = %p, mask %p\n",
|
||||||
p->p_siglist, p->p_sigmask,
|
pending_set, p->p_sigmask,
|
||||||
tempset);
|
tempset);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -456,7 +456,7 @@ ibcs2_sigpending(td, uap)
|
|||||||
ibcs2_sigset_t iss;
|
ibcs2_sigset_t iss;
|
||||||
|
|
||||||
PROC_LOCK(p);
|
PROC_LOCK(p);
|
||||||
bss = p->p_siglist;
|
ksiginfo_to_sigset_t(p, &bss);
|
||||||
SIGSETAND(bss, p->p_sigmask);
|
SIGSETAND(bss, p->p_sigmask);
|
||||||
PROC_UNLOCK(p);
|
PROC_UNLOCK(p);
|
||||||
bsd_to_ibcs2_sigset(&bss, &iss);
|
bsd_to_ibcs2_sigset(&bss, &iss);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user