From ab0dada4d9fda0946ad0df0bc32ea802bb16e69d Mon Sep 17 00:00:00 2001 From: Phil Holland Date: Mon, 18 Oct 2004 07:04:18 +0000 Subject: [PATCH] STABLE12-darwin-afsdb-handler-signal-mask-20040728 FIXES 6027 mask signals on darwin so afsdb handler doesn't die (cherry picked from commit 9728182c00db80f61aa78e225ecaffcc4df7615c) --- 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 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/afs/DARWIN/osi_prototypes.h b/src/afs/DARWIN/osi_prototypes.h index ed68243c1..1cfe6727f 100644 --- a/src/afs/DARWIN/osi_prototypes.h +++ b/src/afs/DARWIN/osi_prototypes.h @@ -17,6 +17,11 @@ /* 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 ceac98d8d..3c365dd5a 100644 --- a/src/afs/DARWIN/osi_sleep.c +++ b/src/afs/DARWIN/osi_sleep.c @@ -211,3 +211,31 @@ void afs_osi_Wakeup(char *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; + } +} diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 0792f2264..ca1123b8c 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -838,7 +838,7 @@ long 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 89a38d4e8..5200fc0f3 100644 --- a/src/afs/afs_osi.c +++ b/src/afs/afs_osi.c @@ -291,6 +291,26 @@ void afs_osi_MaskSignals(){ void afs_osi_UnmaskRxkSignals(){ } +/* 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(){ #ifdef AFS_LINUX22_ENV -- 2.39.5