From 642b68993e009f2495c8125e6f7e8ca6f1981ed8 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Sun, 9 Dec 2007 12:21:51 +0000 Subject: Ticket #428: Conference bridge does not update transmitter_cnt when port is removed git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1624 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/conference.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'pjmedia') diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index 723adbae..ee655a42 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -1014,29 +1014,40 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf, /* Remove this port from transmit array of other ports. */ for (i=0; imax_ports; ++i) { unsigned j; + struct conf_port *src_port; - conf_port = conf->ports[i]; + src_port = conf->ports[i]; - if (!conf_port) + if (!src_port) continue; - if (conf_port->listener_cnt == 0) + if (src_port->listener_cnt == 0) continue; - for (j=0; jlistener_cnt; ++j) { - if (conf_port->listener_slots[j] == port) { - pj_array_erase(conf_port->listener_slots, sizeof(SLOT_TYPE), - conf_port->listener_cnt, j); + for (j=0; jlistener_cnt; ++j) { + if (src_port->listener_slots[j] == port) { + pj_array_erase(src_port->listener_slots, sizeof(SLOT_TYPE), + src_port->listener_cnt, j); + pj_assert(conf->connect_cnt > 0); --conf->connect_cnt; - --conf_port->listener_cnt; + --src_port->listener_cnt; break; } } } - /* Update conf's connection count. */ - conf_port = conf->ports[port]; - conf->connect_cnt -= conf_port->listener_cnt; + /* Update transmitter_cnt of ports we're transmitting to */ + while (conf_port->listener_cnt) { + unsigned dst_slot; + struct conf_port *dst_port; + + dst_slot = conf_port->listener_slots[conf_port->listener_cnt-1]; + dst_port = conf->ports[dst_slot]; + --dst_port->transmitter_cnt; + --conf_port->listener_cnt; + pj_assert(conf->connect_cnt > 0); + --conf->connect_cnt; + } /* Remove the port. */ conf->ports[port] = NULL; -- cgit v1.2.3