[sr-dev] git:tmp/tm_async_reply_support: modules/tm: more async improvements
Jason Penton
jason.penton at gmail.com
Fri Jul 12 16:14:36 CEST 2013
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.penton at smilecoms.com>
Committer: Jason Penton <jason.penton at 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
More information about the sr-dev
mailing list