]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 012036e4de44862384bb92599d7d0c3d5c318434..4ed7b0411420f78de2afa310df39c851eea78475 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 8bfc4127cedbb8b732fab63be3ae693c184c4e41..98338aaaf56d00ce321a79424f9ff95758019bdc 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 0c8e90d2d0227ce07870fbc8c168ffe85f651132..2d5e67424ed474e672b0af96640f30877f39b1f5 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 ce9a8ce47f83d779ef32c6771b2d9da5a7669303..f6cafb5bce525732b69dce7b451b354d36e80c89 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 84e787b2c7d2750caa04052b920e821b4a2efb11..a9e2b62fd0ba7edfd2835f48995a5478808b8237 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);