darwin-afsdb-handler-signal-mask-20040728
authorPhil Holland <hollandp@umich.edu>
Thu, 29 Jul 2004 04:32:56 +0000 (04:32 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 29 Jul 2004 04:32:56 +0000 (04:32 +0000)
FIXES 6027

mask signals on darwin so afsdb handler doesn't die

src/afs/DARWIN/osi_prototypes.h
src/afs/DARWIN/osi_sleep.c
src/afs/afs_call.c
src/afs/afs_osi.c
src/afs/afs_prototypes.h

index 012036e..4ed7b04 100644 (file)
@@ -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);
index 8bfc412..98338aa 100644 (file)
@@ -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)
 {
index 0c8e90d..2d5e674 100644 (file)
@@ -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);
index ce9a8ce..f6cafb5 100644 (file)
@@ -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)
index 84e787b..a9e2b62 100644 (file)
@@ -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);