diff freeDiameter/p_psm.c @ 38:68c1890f7049

Fixed a small bug in SCTP close
author Sebastien Decugis <sdecugis@nict.go.jp>
date Thu, 05 Nov 2009 17:29:12 +0900
parents cc3c59fe98fe
children 7e1deaa89540
line wrap: on
line diff
--- a/freeDiameter/p_psm.c	Thu Nov 05 14:28:46 2009 +0900
+++ b/freeDiameter/p_psm.c	Thu Nov 05 17:29:12 2009 +0900
@@ -242,26 +242,33 @@
 }
 
 /* Cleanup the peer */
-void fd_psm_cleanup(struct fd_peer * peer)
+void fd_psm_cleanup(struct fd_peer * peer, int terminate)
 {
 	/* Move to CLOSED state: failover messages, stop OUT thread, unlink peer from active list */
 	CHECK_FCT_DO( fd_psm_change_state(peer, STATE_CLOSED), /* continue */ );
 	
-	/* Destroy data */
-	CHECK_FCT_DO( fd_thr_term(&peer->p_ini_thr), /* continue */);
+
+	fd_p_cnx_abort(peer, terminate);
+	
 	if (peer->p_cnxctx) {
 		fd_cnx_destroy(peer->p_cnxctx);
 		peer->p_cnxctx = NULL;
 	}
+	
 	if (peer->p_initiator) {
 		fd_cnx_destroy(peer->p_initiator);
 		peer->p_initiator = NULL;
 	}
+	
 	if (peer->p_receiver) {
 		fd_cnx_destroy(peer->p_receiver);
 		peer->p_receiver = NULL;
 	}
 	
+	if (terminate) {
+		CHECK_FCT_DO( fd_fifo_del(&peer->p_events), /* continue */ );
+	}
+	
 }
 
 
@@ -526,7 +533,7 @@
 				
 			case STATE_CLOSING:
 				/* Cleanup the peer */
-				fd_psm_cleanup(peer);
+				fd_psm_cleanup(peer, 0);
 
 				/* Reset the timer */
 				fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc);
@@ -601,7 +608,7 @@
 			case STATE_WAITCNXACK:
 			case STATE_WAITCEA:
 				/* Destroy the connection, restart the timer to a new connection attempt */
-				fd_psm_cleanup(peer);
+				fd_psm_cleanup(peer, 0);
 				fd_psm_next_timeout(peer, 1, peer->p_hdr.info.config.pic_tctimer ?: fd_g_config->cnf_timer_tc);
 				break;
 				
@@ -621,8 +628,7 @@
 	goto psm_loop;
 
 psm_end:
-	fd_psm_cleanup(peer);
-	CHECK_FCT_DO( fd_fifo_del(&peer->p_events), /* continue */ );
+	fd_psm_cleanup(peer, 1);
 	pthread_cleanup_pop(1); /* set STATE_ZOMBIE */
 	peer->p_psm = (pthread_t)NULL;
 	pthread_detach(pthread_self());
@@ -674,7 +680,7 @@
 	CHECK_FCT_DO( fd_thr_term(&peer->p_psm), /* continue */ );
 	
 	/* Cleanup the data */
-	fd_psm_cleanup(peer);
+	fd_psm_cleanup(peer, 1);
 	
 	/* Destroy the event list */
 	CHECK_FCT_DO( fd_fifo_del(&peer->p_events), /* continue */ );
"Welcome to our mercurial repository"