@@ -51,7 +51,8 @@ PMIX_EXPORT pmix_status_t PMIx_Notify_event(pmix_status_t status, const pmix_pro
51
51
return PMIX_ERR_INIT ;
52
52
}
53
53
54
- if (PMIX_PEER_IS_SERVER (pmix_globals .mypeer ) || PMIX_PEER_IS_TOOL (pmix_globals .mypeer )) {
54
+ if (PMIX_PEER_IS_SERVER (pmix_globals .mypeer ) ||
55
+ PMIX_PEER_IS_TOOL (pmix_globals .mypeer )) {
55
56
PMIX_RELEASE_THREAD (& pmix_global_lock );
56
57
57
58
pmix_output_verbose (2 , pmix_server_globals .event_output ,
@@ -273,8 +274,10 @@ static pmix_status_t notify_server_of_event(pmix_status_t status, const pmix_pro
273
274
274
275
if (PMIX_RANGE_PROC_LOCAL != range && NULL != msg ) {
275
276
/* if this is a "lost-connection" event, then there is no
276
- * server to pass it to! */
277
- if (PMIX_ERR_LOST_CONNECTION == status ) {
277
+ * server to pass it to! Likewise, we don't pass it to
278
+ * ourselves */
279
+ if (PMIX_ERR_LOST_CONNECTION == status ||
280
+ pmix_globals .mypeer == pmix_client_globals .myserver ) {
278
281
PMIX_RELEASE (msg );
279
282
goto local ;
280
283
}
@@ -391,11 +394,15 @@ static void cycle_events(int sd, short args, void *cbdata)
391
394
392
395
/* if the caller indicates that the chain is completed,
393
396
* or we completed the "last" event */
394
- if (PMIX_EVENT_ACTION_COMPLETE == chain -> interim_status
395
- || PMIX_EVENT_ORDER_LAST_OVERALL == chain -> evhdlr -> precedence || chain -> endchain ) {
397
+ if (PMIX_EVENT_ACTION_COMPLETE == chain -> interim_status ||
398
+ PMIX_EVENT_ORDER_LAST_OVERALL == chain -> evhdlr -> precedence || chain -> endchain ) {
396
399
if (PMIX_EVENT_ACTION_COMPLETE == chain -> interim_status ) {
397
400
chain -> interim_status = PMIX_SUCCESS ;
398
401
}
402
+ if (chain -> evhdlr -> oneshot ) {
403
+ /* remove this handler */
404
+ pmix_deregister_event_hdlr (chain -> evhdlr -> index , NULL );
405
+ }
399
406
goto complete ;
400
407
}
401
408
item = NULL ;
@@ -409,8 +416,7 @@ static void cycle_events(int sd, short args, void *cbdata)
409
416
} else {
410
417
item = & chain -> evhdlr -> super ;
411
418
}
412
- while (pmix_list_get_end (& pmix_globals .events .single_events )
413
- != (item = pmix_list_get_next (item ))) {
419
+ while (pmix_list_get_end (& pmix_globals .events .single_events ) != (item = pmix_list_get_next (item ))) {
414
420
nxt = (pmix_event_hdlr_t * ) item ;
415
421
if (nxt -> codes [0 ] == chain -> status && pmix_notify_check_range (& nxt -> rng , & chain -> source )
416
422
&& pmix_notify_check_affected (nxt -> affected , nxt -> naffected , chain -> affected ,
@@ -499,8 +505,7 @@ static void cycle_events(int sd, short args, void *cbdata)
499
505
} else if (NULL == item ) {
500
506
item = & chain -> evhdlr -> super ;
501
507
}
502
- if (pmix_list_get_end (& pmix_globals .events .default_events )
503
- != (item = pmix_list_get_next (item ))) {
508
+ if (pmix_list_get_end (& pmix_globals .events .default_events ) != (item = pmix_list_get_next (item ))) {
504
509
nxt = (pmix_event_hdlr_t * ) item ;
505
510
/* if this event handler provided a range, check to see if
506
511
* the source fits within it */
@@ -687,7 +692,8 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
687
692
}
688
693
}
689
694
if (!found ) {
690
- pmix_output_verbose (8 , pmix_client_globals .event_output , "%s %s:%d" ,
695
+ pmix_output_verbose (8 , pmix_client_globals .event_output ,
696
+ "%s Ignoring event %s:%d" ,
691
697
PMIX_NAME_PRINT (& pmix_globals .myid ), __FILE__ , __LINE__ );
692
698
goto complete ;
693
699
}
@@ -1089,6 +1095,10 @@ static void _notify_client_event(int sd, short args, void *cbdata)
1089
1095
if (PMIX_CHECK_PROCID (& cd -> source , & pr -> peer -> info -> pname )) {
1090
1096
continue ;
1091
1097
}
1098
+ /* don't notify ourselves - we handle this internally */
1099
+ if (PMIX_CHECK_PROCID (& pmix_globals .myid , & pr -> peer -> info -> pname )) {
1100
+ continue ;
1101
+ }
1092
1102
/* if we have already notified this client, then don't do it again */
1093
1103
matched = false;
1094
1104
PMIX_LIST_FOREACH (nm , & trk , pmix_namelist_t ) {
@@ -1353,8 +1363,10 @@ void pmix_event_timeout_cb(int fd, short flags, void *arg)
1353
1363
PMIX_RETAIN (ch );
1354
1364
1355
1365
/* process this event thru the regular channels */
1356
- if (PMIX_PEER_IS_SERVER (pmix_globals .mypeer ) && !PMIX_PEER_IS_LAUNCHER (pmix_globals .mypeer )) {
1357
- pmix_server_notify_client_of_event (ch -> status , & ch -> source , ch -> range , ch -> info , ch -> ninfo ,
1366
+ if (PMIX_PEER_IS_SERVER (pmix_globals .mypeer ) &&
1367
+ !PMIX_PEER_IS_LAUNCHER (pmix_globals .mypeer )) {
1368
+ pmix_server_notify_client_of_event (ch -> status , & ch -> source , ch -> range ,
1369
+ ch -> info , ch -> ninfo ,
1358
1370
ch -> final_cbfunc , ch -> final_cbdata );
1359
1371
} else {
1360
1372
pmix_invoke_local_event_hdlr (ch );
@@ -1427,6 +1439,7 @@ static void sevcon(pmix_event_hdlr_t *p)
1427
1439
p -> name = NULL ;
1428
1440
p -> index = UINT_MAX ;
1429
1441
p -> precedence = PMIX_EVENT_ORDER_NONE ;
1442
+ p -> oneshot = false;
1430
1443
p -> locator = NULL ;
1431
1444
p -> rng .range = PMIX_RANGE_UNDEF ;
1432
1445
p -> rng .procs = NULL ;
0 commit comments