From 9728182c00db80f61aa78e225ecaffcc4df7615c Mon Sep 17 00:00:00 2001 From: Phil Holland Date: Thu, 29 Jul 2004 04:32:56 +0000 Subject: [PATCH] darwin-afsdb-handler-signal-mask-20040728 FIXES 6027 mask signals on darwin so afsdb handler doesn't die --- src/afs/DARWIN/osi_prototypes.h | 5 +++++ src/afs/DARWIN/osi_sleep.c | 28 ++++++++++++++++++++++++++++ src/afs/afs_call.c | 2 +- src/afs/afs_osi.c | 20 ++++++++++++++++++++ src/afs/afs_prototypes.h | 1 + 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/afs/DARWIN/osi_prototypes.h b/src/afs/DARWIN/osi_prototypes.h index 012036e4d..4ed7b0411 100644 --- a/src/afs/DARWIN/osi_prototypes.h +++ b/src/afs/DARWIN/osi_prototypes.h @@ -20,6 +20,11 @@ extern afs_rwlock_t afs_xosi; /* osi_misc.c */ extern int osi_lookupname(char *aname, enum uio_seg seg, int followlink, struct vnode **dirvpp, struct vnode **vpp); + +/* osi_sleep.c */ +extern void afs_osi_fullSigMask(void); +extern void afs_osi_fullSigRestore(void); + /* osi_vm.c */ extern void osi_VM_NukePages(struct vnode *vp, off_t offset, off_t size); extern int osi_VM_Setup(struct vcache *avc, int force); diff --git a/src/afs/DARWIN/osi_sleep.c b/src/afs/DARWIN/osi_sleep.c index 8bfc4127c..98338aaaf 100644 --- a/src/afs/DARWIN/osi_sleep.c +++ b/src/afs/DARWIN/osi_sleep.c @@ -150,6 +150,34 @@ afs_osi_Sleep(void *event) relevent(evp); } +void +afs_osi_fullSigMask() +{ + struct uthread *user_thread = (struct uthread *)get_bsdthread_info(current_act()); + + /* Protect original sigmask */ + if (!user_thread->uu_oldmask) { + /* Back up current sigmask */ + user_thread->uu_oldmask = user_thread->uu_sigmask; + /* Mask all signals */ + user_thread->uu_sigmask = ~(sigset_t)0; + } +} + +void +afs_osi_fullSigRestore() +{ + struct uthread *user_thread = (struct uthread *)get_bsdthread_info(current_act()); + + /* Protect original sigmask */ + if (user_thread->uu_oldmask) { + /* Restore original sigmask */ + user_thread->uu_sigmask = user_thread->uu_oldmask; + /* Clear the oldmask */ + user_thread->uu_oldmask = (sigset_t)0; + } +} + int afs_osi_SleepSig(void *event) { diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 0c8e90d2d..2d5e67424 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -875,7 +875,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6) char *cellname = afs_osi_Alloc(cellLen); #ifndef UKERNEL - afs_osi_MaskSignals(); + afs_osi_MaskUserLoop(); #endif AFS_COPYIN((afs_int32 *) parm2, cellname, cellLen, code); AFS_COPYIN((afs_int32 *) parm3, kmsg, kmsgLen, code); diff --git a/src/afs/afs_osi.c b/src/afs/afs_osi.c index ce9a8ce47..f6cafb5bc 100644 --- a/src/afs/afs_osi.c +++ b/src/afs/afs_osi.c @@ -310,6 +310,26 @@ afs_osi_UnmaskRxkSignals(void) { } +/* Two hacks to try and fix afsdb */ +void +afs_osi_MaskUserLoop() +{ +#ifdef AFS_DARWIN_ENV + afs_osi_Invisible(); + afs_osi_fullSigMask(); +#else + afs_osi_MaskSignals(); +#endif +} + +void +afs_osi_UnmaskUserLoop() +{ +#ifdef AFS_DARWIN_ENV + afs_osi_fullSigRestore(); +#endif +} + /* register rxk listener proc info */ void afs_osi_RxkRegister(void) diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h index 84e787b2c..a9e2b62fd 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -464,6 +464,7 @@ extern void afs_osi_Invisible(void); extern void afs_osi_RxkRegister(void); extern void afs_osi_MaskSignals(void); extern void afs_osi_UnmaskRxkSignals(void); +extern void afs_osi_MaskUserLoop(void); extern void *afs_osi_Alloc_debug(size_t x, char *func, int line); #ifndef afs_osi_Alloc_NoSleep extern void *afs_osi_Alloc_NoSleep(size_t x); -- 2.39.5