From 70cf4f63468cc2661d4e72154936fe190bb92b26 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Mon, 28 Jul 2008 20:17:04 +0000 Subject: Ticket #538: Closed TCP connection should be removed from the hash table immediately git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2180 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip/sip_transport.c | 6 ++++++ pjsip/src/pjsip/sip_transport_tcp.c | 25 +++++++++++++------------ pjsip/src/pjsip/sip_transport_tls_ossl.c | 20 ++++++++++---------- 3 files changed, 29 insertions(+), 22 deletions(-) (limited to 'pjsip') diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c index c0b520a6..9727858b 100644 --- a/pjsip/src/pjsip/sip_transport.c +++ b/pjsip/src/pjsip/sip_transport.c @@ -936,6 +936,12 @@ PJ_DEF(pj_status_t) pjsip_transport_shutdown(pjsip_transport *tp) if (status == PJ_SUCCESS) tp->is_shutdown = PJ_TRUE; + /* If transport reference count is zero, start timer count-down */ + if (pj_atomic_get(tp->ref_cnt) == 0) { + pjsip_transport_add_ref(tp); + pjsip_transport_dec_ref(tp); + } + pj_lock_release(tp->lock); pj_lock_release(mgr->lock); diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c index 59f33e49..14842484 100644 --- a/pjsip/src/pjsip/sip_transport_tcp.c +++ b/pjsip/src/pjsip/sip_transport_tcp.c @@ -1067,6 +1067,19 @@ static void on_write_complete(pj_ioqueue_key_t *key, tdata_op_key->tdata = NULL; + if (tdata_op_key->callback) { + /* + * Notify sip_transport.c that packet has been sent. + */ + if (bytes_sent == 0) + bytes_sent = -PJ_RETURN_OS_ERROR(OSERR_ENOTCONN); + + tdata_op_key->callback(&tcp->base, tdata_op_key->token, bytes_sent); + + /* Mark last activity time */ + pj_gettimeofday(&tcp->last_activity); + } + /* Check for error/closure */ if (bytes_sent <= 0) { pj_status_t status; @@ -1080,18 +1093,6 @@ static void on_write_complete(pj_ioqueue_key_t *key, pjsip_transport_shutdown(&tcp->base); } - if (tdata_op_key->callback) { - /* - * Notify sip_transport.c that packet has been sent. - */ - if (bytes_sent == 0) - bytes_sent = -PJ_RETURN_OS_ERROR(OSERR_ENOTCONN); - - tdata_op_key->callback(&tcp->base, tdata_op_key->token, bytes_sent); - - /* Mark last activity time */ - pj_gettimeofday(&tcp->last_activity); - } } diff --git a/pjsip/src/pjsip/sip_transport_tls_ossl.c b/pjsip/src/pjsip/sip_transport_tls_ossl.c index 4e31318b..1d97a79b 100644 --- a/pjsip/src/pjsip/sip_transport_tls_ossl.c +++ b/pjsip/src/pjsip/sip_transport_tls_ossl.c @@ -1839,6 +1839,16 @@ static void on_write_complete(pj_ioqueue_key_t *key, tls = (struct tls_transport*) pj_ioqueue_get_user_data(key); tdata_op_key->tdata = NULL; + if (tdata_op_key->callback) { + /* + * Notify sip_transport.c that packet has been sent. + */ + if (bytes_sent == 0) + bytes_sent = -PJ_RETURN_OS_ERROR(OSERR_ENOTCONN); + + tdata_op_key->callback(&tls->base, tdata_op_key->token, bytes_sent); + } + /* Check for error/closure */ if (bytes_sent <= 0) { pj_status_t status; @@ -1854,16 +1864,6 @@ static void on_write_complete(pj_ioqueue_key_t *key, /* Mark last activity */ pj_gettimeofday(&tls->last_activity); } - - if (tdata_op_key->callback) { - /* - * Notify sip_transport.c that packet has been sent. - */ - if (bytes_sent == 0) - bytes_sent = -PJ_RETURN_OS_ERROR(OSERR_ENOTCONN); - - tdata_op_key->callback(&tls->base, tdata_op_key->token, bytes_sent); - } } -- cgit v1.2.3