static void ft_event(int state) { #if 0 opal_list_item_t *item; #endif if(OPAL_CRS_CHECKPOINT == state) { #if 0 /* * Disable event processing while we are working */ opal_event_disable(); #endif } else if(OPAL_CRS_CONTINUE == state) { #if 0 /* * Resume event processing */ opal_event_enable(); } else if(OPAL_CRS_RESTART == state) { /* * Clean out cached connection information * Select pieces of finalize/init */ for (item = opal_list_remove_first(&mca_oob_tcp_module.peer_list); item != NULL; item = opal_list_remove_first(&mca_oob_tcp_module.peer_list)) { mca_oob_tcp_peer_t* peer = (mca_oob_tcp_peer_t*)item; /* JJH: Use the below command for debugging restarts with invalid sockets * mca_oob_tcp_peer_dump(peer, "RESTART CLEAN") */ MCA_OOB_TCP_PEER_RETURN(peer); } OBJ_DESTRUCT(&mca_oob_tcp_module.peer_free); OBJ_DESTRUCT(&mca_oob_tcp_module.peer_names); OBJ_DESTRUCT(&mca_oob_tcp_module.peers); OBJ_DESTRUCT(&mca_oob_tcp_module.peer_list); OBJ_CONSTRUCT(&mca_oob_tcp_module.peer_list, opal_list_t); OBJ_CONSTRUCT(&mca_oob_tcp_module.peers, opal_hash_table_t); OBJ_CONSTRUCT(&mca_oob_tcp_module.peer_names, opal_hash_table_t); OBJ_CONSTRUCT(&mca_oob_tcp_module.peer_free, opal_free_list_t); /* * Resume event processing */ opal_event_enable(); #endif } else if(OPAL_CRS_TERM == state ) { ; } else { ; } return; }
/* * Lookup a peer by name, create one if it doesn't exist. * @param name Peers globally unique identifier. * @retval Pointer to the newly created struture or NULL on error. */ mca_oob_tcp_peer_t * mca_oob_tcp_peer_lookup(const orte_process_name_t* name) { int rc; mca_oob_tcp_peer_t * peer, *old; if (NULL == name) { /* can't look this one up */ return NULL; } OPAL_THREAD_LOCK(&mca_oob_tcp_component.tcp_lock); peer = (mca_oob_tcp_peer_t*)orte_hash_table_get_proc( &mca_oob_tcp_component.tcp_peers, name); if(NULL != peer && memcmp(&peer->peer_name,name,sizeof(peer->peer_name)) == 0) { OPAL_THREAD_UNLOCK(&mca_oob_tcp_component.tcp_lock); return peer; } /* allocate from free list */ MCA_OOB_TCP_PEER_ALLOC(peer, rc); if(NULL == peer) { OPAL_THREAD_UNLOCK(&mca_oob_tcp_component.tcp_lock); return NULL; } /* initialize peer state */ peer->peer_name = *name; peer->peer_addr = NULL; peer->peer_sd = -1; peer->peer_state = MCA_OOB_TCP_CLOSED; peer->peer_recv_msg = NULL; peer->peer_send_msg = NULL; peer->peer_retries = 0; /* add to lookup table */ if(ORTE_SUCCESS != orte_hash_table_set_proc(&mca_oob_tcp_component.tcp_peers, &peer->peer_name, peer)) { MCA_OOB_TCP_PEER_RETURN(peer); OPAL_THREAD_UNLOCK(&mca_oob_tcp_component.tcp_lock); return NULL; } /* if the peer list is over the maximum size, remove one unsed peer */ opal_list_prepend(&mca_oob_tcp_component.tcp_peer_list, (opal_list_item_t *) peer); if(mca_oob_tcp_component.tcp_peer_limit > 0 && (int)opal_list_get_size(&mca_oob_tcp_component.tcp_peer_list) > mca_oob_tcp_component.tcp_peer_limit) { old = (mca_oob_tcp_peer_t *) opal_list_get_last(&mca_oob_tcp_component.tcp_peer_list); while(1) { if(0 == opal_list_get_size(&(old->peer_send_queue)) && NULL == peer->peer_recv_msg) { opal_list_remove_item(&mca_oob_tcp_component.tcp_peer_list, (opal_list_item_t *) old); MCA_OOB_TCP_PEER_RETURN(old); break; } else { old = (mca_oob_tcp_peer_t *) opal_list_get_prev(old); if(opal_list_get_begin(&mca_oob_tcp_component.tcp_peer_list) == (opal_list_item_t*)old) { /* we tried, but we couldn't find one that was valid to get rid * of. Oh well. */ break; } } } } OPAL_THREAD_UNLOCK(&mca_oob_tcp_component.tcp_lock); return peer; }