]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE12-revert-dont-spawn-kernel-thread-for-rxk-listener-20020426 openafs-stable-1_2_5
authorDerrick Brashear <shadow@dementia.org>
Sun, 9 Jun 2002 01:46:47 +0000 (01:46 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sun, 9 Jun 2002 01:46:47 +0000 (01:46 +0000)
in some cases this causes shutdowns to hang forever. notably shutdown -i0 -g6 -y works while reboot does not

(cherry picked from commit fe1beb4f3e69f4ae2dbec60902b60cd601674d15)

src/rx/rx_kcommon.c

index b98118fd7aee8010ae77e01670f15f02a5af498a..a8cbde40b7f074f585d47b3d5bfc80dad0115283 100644 (file)
@@ -998,7 +998,22 @@ int rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
  */
 int rxk_ListenerPid; /* Used to signal process to wakeup at shutdown */
 
+#ifdef AFS_SUN5_ENV
+/*
+ * Run the listener as a kernel process.
+ */
+void rxk_Listener(void)
+{
+    extern id_t syscid;
+    void rxk_ListenerProc(void);
+    if (newproc(rxk_ListenerProc, syscid, 59))
+       osi_Panic("rxk_Listener: failed to fork listener process!\n");
+}
+
+void rxk_ListenerProc(void)
+#else /* AFS_SUN5_ENV */
 void rxk_Listener(void)
+#endif /* AFS_SUN5_ENV */
 {
     struct rx_packet *rxp = NULL;
     int code;
@@ -1013,9 +1028,9 @@ void rxk_Listener(void)
 #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
     rxk_ListenerPid = current_proc()->p_pid;
 #endif
-#if defined(RX_ENABLE_LOCKS)
+#if defined(RX_ENABLE_LOCKS) && !defined(AFS_SUN5_ENV)
     AFS_GUNLOCK();
-#endif /* RX_ENABLE_LOCKS */
+#endif /* RX_ENABLE_LOCKS && !AFS_SUN5_ENV */
 
     while (afs_termState != AFSOP_STOP_RXK_LISTENER) {
        if (rxp) {
@@ -1047,6 +1062,14 @@ void rxk_Listener(void)
 #if defined(AFS_LINUX22_ENV) || defined(AFS_SUN5_ENV)
     afs_osi_Wakeup(&rxk_ListenerPid);
 #endif
+#ifdef AFS_SUN5_ENV
+    AFS_GUNLOCK();
+#ifdef HAVE_P_COREFILE
+    if (!curproc->p_corefile)  /* newproc doesn't set it, but exit frees it */
+       curproc->p_corefile = refstr_alloc("core");
+#endif
+    exit(CLD_EXITED, 0);
+#endif /* AFS_SUN5_ENV */
 }
 
 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_SUN5_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)