since the rxk listener gets "kill"d at shutdown we need to unmask to wake
it up. this should probably be replaced but the logical way is evil,
involves simulating a packet to the listener so it wakes up and notices it's
time to die
(cherry picked from commit
5c2a4168a6e67733d4ec545936e13742c72ff9f8)
return;
}
+
+struct task_struct *rxk_ListenerTask;
+
+void osi_linux_mask() {
+ spin_lock_irq(¤t->sigmask_lock);
+ sigfillset(¤t->blocked);
+ recalc_sigpending(current);
+ spin_unlock_irq(¤t->sigmask_lock);
+}
+
+void osi_linux_unmask() {
+ spin_lock_irq(&rxk_ListenerTask->sigmask_lock);
+ sigemptyset(&rxk_ListenerTask->blocked);
+ recalc_sigpending(rxk_ListenerTask);
+ spin_unlock_irq(&rxk_ListenerTask->sigmask_lock);
+}
+
+void osi_linux_rxkreg() {
+ rxk_ListenerTask = current;
+}
afs_osi_Invisible();
afs_RX_Running = 2;
afs_osi_Wakeup(&afs_RX_Running);
+#ifndef UKERNEL
+ afs_osi_RxkRegister();
+#endif
rxk_Listener();
}
#ifdef AFS_SGI_ENV
afs_osi_Sleep(&afs_termState);
#if defined(RXK_LISTENER_ENV)
afs_warn("RxListener... ");
+#ifndef UKERNEL
+ afs_osi_UnmaskRxkSignals();
+#endif
/* cancel rx listener */
osi_StopListener(); /* This closes rx_socket. */
while (afs_termState == AFSOP_STOP_RXK_LISTENER)
/* mask signals in afsds */
void afs_osi_MaskSignals(){
#ifdef AFS_LINUX22_ENV
- spin_lock_irq(¤t->sigmask_lock);
- sigfillset(¤t->blocked);
- recalc_sigpending(current);
- spin_unlock_irq(¤t->sigmask_lock);
+ osi_linux_mask();
#endif
}
+/* unmask signals in rxk listener */
+void afs_osi_UnmaskRxkSignals(){
+#ifdef AFS_LINUX22_ENV
+ osi_linux_unmask();
+#endif
+}
+
+/* register rxk listener proc info */
+void afs_osi_RxkRegister(){
+#ifdef AFS_LINUX22_ENV
+ osi_linux_rxkreg();
+#endif
+}
+
/* procedure for making our processes as invisible as we can */
void afs_osi_Invisible() {
#ifdef AFS_LINUX22_ENV