[asterisk-commits] russell: branch kpfleming/SRV-priority-handling r88713 - in /team/kpfleming/S...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Nov 5 14:31:24 CST 2007
Author: russell
Date: Mon Nov 5 14:31:23 2007
New Revision: 88713
URL: http://svn.digium.com/view/asterisk?view=rev&rev=88713
Log:
sync with 1.4 branch
Modified:
team/kpfleming/SRV-priority-handling/ (props changed)
team/kpfleming/SRV-priority-handling/main/channel.c
Propchange: team/kpfleming/SRV-priority-handling/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Nov 5 14:31:23 2007
@@ -1,1 +1,1 @@
-/branches/1.4:1-88689
+/branches/1.4:1-88712
Modified: team/kpfleming/SRV-priority-handling/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/kpfleming/SRV-priority-handling/main/channel.c?view=diff&rev=88713&r1=88712&r2=88713
==============================================================================
--- team/kpfleming/SRV-priority-handling/main/channel.c (original)
+++ team/kpfleming/SRV-priority-handling/main/channel.c Mon Nov 5 14:31:23 2007
@@ -3670,16 +3670,38 @@
original->tech_pvt = clone->tech_pvt;
clone->tech_pvt = t_pvt;
- /* Swap the readq's */
- cur = AST_LIST_FIRST(&original->readq);
- AST_LIST_HEAD_SET_NOLOCK(&original->readq, AST_LIST_FIRST(&clone->readq));
- AST_LIST_HEAD_SET_NOLOCK(&clone->readq, cur);
-
/* Swap the alertpipes */
for (i = 0; i < 2; i++) {
x = original->alertpipe[i];
original->alertpipe[i] = clone->alertpipe[i];
clone->alertpipe[i] = x;
+ }
+
+ /*
+ * Swap the readq's. The end result should be this:
+ *
+ * 1) All frames should be on the new (original) channel.
+ * 2) Any frames that were already on the new channel before this
+ * masquerade need to be at the end of the readq, after all of the
+ * frames on the old (clone) channel.
+ * 3) The alertpipe needs to get poked for every frame that was already
+ * on the new channel, since we are now using the alert pipe from the
+ * old (clone) channel.
+ */
+ {
+ AST_LIST_HEAD_NOLOCK(, ast_frame) tmp_readq;
+ AST_LIST_HEAD_SET_NOLOCK(&tmp_readq, NULL);
+
+ AST_LIST_APPEND_LIST(&tmp_readq, &original->readq, frame_list);
+ AST_LIST_APPEND_LIST(&original->readq, &clone->readq, frame_list);
+
+ while ((cur = AST_LIST_REMOVE_HEAD(&tmp_readq, frame_list))) {
+ AST_LIST_INSERT_TAIL(&original->readq, cur, frame_list);
+ if (original->alertpipe[1] > -1) {
+ int poke = 0;
+ write(original->alertpipe[1], &poke, sizeof(poke));
+ }
+ }
}
/* Swap the raw formats */
@@ -3711,26 +3733,7 @@
}
}
- /* Save any pending frames on both sides. Start by counting
- * how many we're going to need... */
- x = 0;
- if (original->alertpipe[1] > -1) {
- AST_LIST_TRAVERSE(&clone->readq, cur, frame_list)
- x++;
- }
-
- /* If we had any, prepend them to the ones already in the queue, and
- * load up the alertpipe */
- if (AST_LIST_FIRST(&clone->readq)) {
- AST_LIST_INSERT_TAIL(&clone->readq, AST_LIST_FIRST(&original->readq), frame_list);
- AST_LIST_HEAD_SET_NOLOCK(&original->readq, AST_LIST_FIRST(&clone->readq));
- AST_LIST_HEAD_SET_NOLOCK(&clone->readq, NULL);
- for (i = 0; i < x; i++)
- write(original->alertpipe[1], &x, sizeof(x));
- }
-
clone->_softhangup = AST_SOFTHANGUP_DEV;
-
/* And of course, so does our current state. Note we need not
call ast_setstate since the event manager doesn't really consider
More information about the asterisk-commits
mailing list