[mpich2-commits] r7816 - in mpich2/trunk/src/mpid/ch3: channels/nemesis/src src

buntinas at mcs.anl.gov buntinas at mcs.anl.gov
Mon Jan 24 12:39:24 CST 2011


Author: buntinas
Date: 2011-01-24 12:39:24 -0600 (Mon, 24 Jan 2011)
New Revision: 7816

Modified:
   mpich2/trunk/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
   mpich2/trunk/src/mpid/ch3/src/mpid_finalize.c
Log:
restore previous signal handler in finalize

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/src/ch3_progress.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/src/ch3_progress.c	2011-01-24 18:37:43 UTC (rev 7815)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/src/ch3_progress.c	2011-01-24 18:39:24 UTC (rev 7816)
@@ -45,6 +45,9 @@
 #endif /* MPICH_IS_THREADED */
 /* NEMESIS MULTITHREADING - End block*/
 
+#ifdef HAVE_SIGNAL
+static void (*prev_sighandler) (int);
+#endif
 static volatile int sigusr1_count = 0;
 static int my_sigusr1_count = 0;
 
@@ -805,15 +808,11 @@
     pktArray[MPIDI_NEM_PKT_NETMOD] = pkt_NETMOD_handler;
    
 #ifdef HAVE_SIGNAL
-    {
-        /* install signal handler for process failure notifications from hydra */
-        void *ret;
-        
-        ret = signal(SIGUSR1, &sigusr1_handler);
-        MPIU_ERR_CHKANDJUMP1(ret == SIG_ERR, mpi_errno, MPI_ERR_OTHER, "**signal", "**signal %s", MPIU_Strerror(errno));
-        /* Error if the app set its own SIGUSR1 handler. */
-        MPIU_ERR_CHKANDJUMP(ret != SIG_DFL, mpi_errno, MPI_ERR_OTHER, "**sigusr1");
-    }
+    /* install signal handler for process failure notifications from hydra */
+    prev_sighandler = signal(SIGUSR1, sigusr1_handler);
+    MPIU_ERR_CHKANDJUMP1(prev_sighandler == SIG_ERR, mpi_errno, MPI_ERR_OTHER, "**signal", "**signal %s", MPIU_Strerror(errno));
+    /* Error if the app set its own SIGUSR1 handler. */
+    MPIU_ERR_CHKANDJUMP(prev_sighandler != SIG_DFL, mpi_errno, MPI_ERR_OTHER, "**sigusr1");
 #endif
 
  fn_exit:
@@ -829,19 +828,33 @@
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
 int MPIDI_CH3I_Progress_finalize(void)
 {
+    int mpi_errno = MPI_SUCCESS;
     qn_ent_t *ent;
     MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_PROGRESS_FINALIZE);
 
     MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_PROGRESS_FINALIZE);
 
+#ifdef HAVE_SIGNAL
+    {
+        /* replace signal handler */
+        void *ret;
+        
+        ret = signal(SIGUSR1, prev_sighandler);
+        MPIU_ERR_CHKANDJUMP1(ret == SIG_ERR, mpi_errno, MPI_ERR_OTHER, "**signal", "**signal %s", MPIU_Strerror(errno));
+    }
+#endif
+
     while(qn_head) {
         ent = qn_head->next;
         MPIU_Free(qn_head);
         qn_head = ent;
     }
 
+ fn_exit:
     MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_PROGRESS_FINALIZE);
-    return MPI_SUCCESS;
+    return mpi_errno;
+ fn_fail:
+    goto fn_exit;
 }
 
 

Modified: mpich2/trunk/src/mpid/ch3/src/mpid_finalize.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/src/mpid_finalize.c	2011-01-24 18:37:43 UTC (rev 7815)
+++ mpich2/trunk/src/mpid/ch3/src/mpid_finalize.c	2011-01-24 18:39:24 UTC (rev 7816)
@@ -93,9 +93,6 @@
       *    cancel it, in which case an error shouldn't be generated.
       */
     
-    MPIR_Comm_free_keyval_impl(MPICH_ATTR_FAILED_PROCESSES);
-    MPICH_ATTR_FAILED_PROCESSES = MPI_KEYVAL_INVALID;
-    
 #ifdef MPID_NEEDS_ICOMM_WORLD
     mpi_errno = MPIR_Comm_release_always(MPIR_Process.icomm_world, 0);
     if (mpi_errno) MPIU_ERR_POP(mpi_errno);
@@ -125,6 +122,9 @@
     mpi_errno = MPIDI_CH3_Finalize();
     if (mpi_errno) { MPIU_ERR_POP(mpi_errno); }
 
+    MPIR_Comm_free_keyval_impl(MPICH_ATTR_FAILED_PROCESSES);
+    MPICH_ATTR_FAILED_PROCESSES = MPI_KEYVAL_INVALID;
+    
     /* Tell the process group code that we're done with the process groups.
        This will notify PMI (with PMI_Finalize) if necessary.  It
        also frees all PG structures, including the PG for COMM_WORLD, whose 



More information about the mpich2-commits mailing list