Module: sip-router
Branch: tmp/tm_async_reply_support
Commit: 749ce7e29901f79597c461c4cd161d3c3e24dda2
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=749ce7e29901f79597c461c4cd161d3c3e24dda2

Author: Jason Penton <jason.pen...@smilecoms.com>
Committer: Jason Penton <jason.pen...@smilecoms.com>
Date:   Fri Jul 12 16:14:08 2013 +0200

modules/tm: more async improvements

---

 modules/tm/h_table.h   |    2 ++
 modules/tm/t_fwd.c     |    2 ++
 modules/tm/t_reply.c   |    4 ++--
 modules/tm/t_suspend.c |   17 +++++++----------
 4 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/modules/tm/h_table.h b/modules/tm/h_table.h
index e4f2fa1..48027c4 100644
--- a/modules/tm/h_table.h
+++ b/modules/tm/h_table.h
@@ -270,6 +270,7 @@ typedef struct async_state
 {        
         unsigned int backup_route;
         unsigned int backup_branch;
+        unsigned int blind_uac;
         unsigned int ruri_new;
 }async_state_type;
 
@@ -317,6 +318,7 @@ struct totag_elem {
 #      define T_PASS_PROVISIONAL_FLAG (1<<11)
 #      define pass_provisional(_t_)    ((_t_)->flags&T_PASS_PROVISIONAL_FLAG)
 #endif
+#define T_ASYNC_CONTINUE (1<<9) /* Is this transaction in a continuation after 
being suspended */
 
 /* unsigned short should be enough for a retr. timer: max. 65535 ms =>
  * max retr. = 65 s which should be enough and saves us 2*2 bytes */
diff --git a/modules/tm/t_fwd.c b/modules/tm/t_fwd.c
index 55d45f4..d4b967d 100644
--- a/modules/tm/t_fwd.c
+++ b/modules/tm/t_fwd.c
@@ -755,6 +755,8 @@ int add_blind_uac( /*struct cell *t*/ )
        membar_write(); /* to allow lockless prepare_to_cancel() we want to be 
sure
                                           all the writes finished before 
updating branch number*/
        t->nr_of_outgoings=(branch+1);
+       t->async_backup.blind_uac = branch;
+        
        /* start FR timer -- protocol set by default to PROTO_NONE,
        which means retransmission timer will not be started
     */
diff --git a/modules/tm/t_reply.c b/modules/tm/t_reply.c
index c009a18..2a45188 100644
--- a/modules/tm/t_reply.c
+++ b/modules/tm/t_reply.c
@@ -1379,8 +1379,8 @@ int t_pick_branch(int inc_branch, int inc_code, struct 
cell *t, int *res_code)
                 * to be a pending, incomplete branch. */
                if ((!t->uac[b].request.buffer) && 
(t->uac[b].last_received>=200))
                        continue;
-               /* there is still an unfinished UAC transaction; wait now! */
-               if ( t->uac[b].last_received<200 )
+               /* there is still an unfinished UAC transaction (we ignore 
unfinished blind UACs) wait now! */
+               if ( t->uac[b].last_received<200 && 
!((t->flags&T_ASYNC_CONTINUE) && b==t->async_backup.blind_uac))
                        return -2;
                /* if reply is null => t_send_branch "faked" reply, skip over 
it */
                if ( rpl && 
diff --git a/modules/tm/t_suspend.c b/modules/tm/t_suspend.c
index 3b03f97..b9c92e6 100644
--- a/modules/tm/t_suspend.c
+++ b/modules/tm/t_suspend.c
@@ -103,7 +103,7 @@ int t_suspend(struct sip_msg *msg,
        *hash_index = t->hash_index;
        *label = t->label;
 
-       /* add a bling UAC to let the fr timer running */
+       /* add a blind UAC to let the fr timer running */
        if (add_blind_uac() < 0) {
                LOG(L_ERR, "ERROR: t_suspend: " \
                        "failed to add the blind UAC\n");
@@ -205,15 +205,12 @@ int t_continue(unsigned int hash_index, unsigned int 
label,
         * form calling t_continue() multiple times simultaneously */
        LOCK_ASYNC_CONTINUE(t);
 
-       /* Try to find the blind UAC, and cancel its fr timer.
-        * We assume that the last blind uac called t_continue(). */
-       for (   branch = t->nr_of_outgoings-1;
-               branch >= 0 && t->uac[branch].request.buffer;
-               branch--);
-
-       if (branch >= 0) {
+        t->flags |= T_ASYNC_CONTINUE;   //we can now know anywhere in kamailio 
that we are executing post a suspend.
+        
+       
+        branch = t->async_backup.blind_uac;
+        if (branch >= 0) {
                stop_rb_timers(&t->uac[branch].request);
-
                if (t->uac[branch].last_received != 0) {
                        /* Either t_continue() has already been
                         * called or the branch has already timed out.
@@ -231,7 +228,7 @@ int t_continue(unsigned int hash_index, unsigned int label,
                 * for example when t_reply() is called from
                 * a failure route => deadlock, because both
                 * of them need the reply lock to be held. */
-               t->uac[branch].last_received=500;
+               //t->uac[branch].last_received=500; we dont need this anymore, 
we are not locking replies
                uac = &t->uac[branch];
        }
        /* else


_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to