summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-07-28 20:17:04 +0000
committerBenny Prijono <bennylp@teluu.com>2008-07-28 20:17:04 +0000
commit70cf4f63468cc2661d4e72154936fe190bb92b26 (patch)
tree5ba17999ef71b2113e19dd3b923e09409691bf57
parentdc4fedbe2b386a88da7727814a903773b759b706 (diff)
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
-rw-r--r--pjsip/src/pjsip/sip_transport.c6
-rw-r--r--pjsip/src/pjsip/sip_transport_tcp.c25
-rw-r--r--pjsip/src/pjsip/sip_transport_tls_ossl.c20
3 files changed, 29 insertions, 22 deletions
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);
- }
}