/* 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);
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)
{
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);
{
}
+/* 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)
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);