@@ -356,6 +356,17 @@ void pmix_server_notify(int status, orte_process_name_t* sender,
356356        }
357357    }
358358
359+     /* protect against infinite loops by marking that this notification was 
360+      * passed down to the server by me */ 
361+     if  (NULL  ==  cd -> info ) {
362+         cd -> info  =  OBJ_NEW (opal_list_t );
363+     }
364+     val  =  OBJ_NEW (opal_value_t );
365+     val -> key  =  strdup ("orte.notify.donotloop" );
366+     val -> type  =  OPAL_BOOL ;
367+     val -> data .flag  =  true;
368+     opal_list_append (cd -> info , & val -> super );
369+ 
359370    opal_output_verbose (2 , orte_pmix_server_globals .output ,
360371                        "%s NOTIFYING PMIX SERVER OF STATUS %d" ,
361372                        ORTE_NAME_PRINT (ORTE_PROC_MY_NAME ), ret );
@@ -382,6 +393,14 @@ int pmix_server_notify_event(int code, opal_process_name_t *source,
382393                        ORTE_NAME_PRINT (ORTE_PROC_MY_NAME ),
383394                        ORTE_NAME_PRINT (source ), code );
384395
396+     /* check to see if this is one we sent down */ 
397+     OPAL_LIST_FOREACH (val , info , opal_value_t ) {
398+         if  (0  ==  strcmp (val -> key , "orte.notify.donotloop" )) {
399+             /* yep - do not process */ 
400+             goto done ;
401+         }
402+     }
403+ 
385404    /* a local process has generated an event - we need to xcast it 
386405     * to all the daemons so it can be passed down to their local 
387406     * procs */ 
@@ -448,6 +467,7 @@ int pmix_server_notify_event(int code, opal_process_name_t *source,
448467    /* maintain accounting */ 
449468    OBJ_RELEASE (sig );
450469
470+   done :
451471    /* execute the callback */ 
452472    if  (NULL  !=  cbfunc ) {
453473        cbfunc (ORTE_SUCCESS , cbdata );
0 commit comments