summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2009-04-07 12:56:02 +0000
committerNanang Izzuddin <nanang@teluu.com>2009-04-07 12:56:02 +0000
commitebc2eccffb43b2f13433038d5fe23b4672e8a7ab (patch)
tree917d4846329e9c31d0f5f16e29019fae005d5bba /pjmedia
parent3d3fddc808128601f908f3141933987da15d3538 (diff)
Ticket #781: Fixed conf bridge API functions to have mutex protection when accessing ports.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2582 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/src/pjmedia/conference.c101
1 files changed, 79 insertions, 22 deletions
diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c
index c39ec036..e23fab69 100644
--- a/pjmedia/src/pjmedia/conference.c
+++ b/pjmedia/src/pjmedia/conference.c
@@ -887,8 +887,14 @@ PJ_DEF(pj_status_t) pjmedia_conf_configure_port( pjmedia_conf *conf,
/* Check arguments */
PJ_ASSERT_RETURN(conf && slot<conf->max_ports, PJ_EINVAL);
+ pj_mutex_lock(conf->mutex);
+
/* Port must be valid. */
- PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL);
+ conf_port = conf->ports[slot];
+ if (conf_port == NULL) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
conf_port = conf->ports[slot];
@@ -898,6 +904,8 @@ PJ_DEF(pj_status_t) pjmedia_conf_configure_port( pjmedia_conf *conf,
if (rx != PJMEDIA_PORT_NO_CHANGE)
conf_port->rx_setting = rx;
+ pj_mutex_unlock(conf->mutex);
+
return PJ_SUCCESS;
}
@@ -918,17 +926,18 @@ PJ_DEF(pj_status_t) pjmedia_conf_connect_port( pjmedia_conf *conf,
PJ_ASSERT_RETURN(conf && src_slot<conf->max_ports &&
sink_slot<conf->max_ports, PJ_EINVAL);
- /* Ports must be valid. */
- PJ_ASSERT_RETURN(conf->ports[src_slot] != NULL, PJ_EINVAL);
- PJ_ASSERT_RETURN(conf->ports[sink_slot] != NULL, PJ_EINVAL);
-
/* For now, level MUST be zero. */
PJ_ASSERT_RETURN(level == 0, PJ_EINVAL);
pj_mutex_lock(conf->mutex);
+ /* Ports must be valid. */
src_port = conf->ports[src_slot];
dst_port = conf->ports[sink_slot];
+ if (!src_port || !dst_port) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
/* Check if connection has been made */
for (i=0; i<src_port->listener_cnt; ++i) {
@@ -980,14 +989,15 @@ PJ_DEF(pj_status_t) pjmedia_conf_disconnect_port( pjmedia_conf *conf,
PJ_ASSERT_RETURN(conf && src_slot<conf->max_ports &&
sink_slot<conf->max_ports, PJ_EINVAL);
- /* Ports must be valid. */
- PJ_ASSERT_RETURN(conf->ports[src_slot] != NULL, PJ_EINVAL);
- PJ_ASSERT_RETURN(conf->ports[sink_slot] != NULL, PJ_EINVAL);
-
pj_mutex_lock(conf->mutex);
+ /* Ports must be valid. */
src_port = conf->ports[src_slot];
dst_port = conf->ports[sink_slot];
+ if (!src_port || !dst_port) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
/* Check if connection has been made */
for (i=0; i<src_port->listener_cnt; ++i) {
@@ -1058,9 +1068,6 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf,
/* Check arguments */
PJ_ASSERT_RETURN(conf && port < conf->max_ports, PJ_EINVAL);
- /* Port must be valid. */
- PJ_ASSERT_RETURN(conf->ports[port] != NULL, PJ_EINVAL);
-
/* Suspend the sound devices.
* Don't want to remove port while port is being accessed by sound
* device's threads!
@@ -1068,7 +1075,13 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf,
pj_mutex_lock(conf->mutex);
+ /* Port must be valid. */
conf_port = conf->ports[port];
+ if (conf_port == NULL) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
+
conf_port->tx_setting = PJMEDIA_PORT_DISABLE;
conf_port->rx_setting = PJMEDIA_PORT_DISABLE;
@@ -1137,6 +1150,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_enum_ports( pjmedia_conf *conf,
PJ_ASSERT_RETURN(conf && p_count && ports, PJ_EINVAL);
+ /* Lock mutex */
+ pj_mutex_lock(conf->mutex);
+
for (i=0; i<conf->max_ports && count<*p_count; ++i) {
if (!conf->ports[i])
continue;
@@ -1144,6 +1160,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_enum_ports( pjmedia_conf *conf,
ports[count++] = i;
}
+ /* Unlock mutex */
+ pj_mutex_unlock(conf->mutex);
+
*p_count = count;
return PJ_SUCCESS;
}
@@ -1160,10 +1179,15 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_port_info( pjmedia_conf *conf,
/* Check arguments */
PJ_ASSERT_RETURN(conf && slot<conf->max_ports, PJ_EINVAL);
- /* Port must be valid. */
- PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL);
+ /* Lock mutex */
+ pj_mutex_lock(conf->mutex);
+ /* Port must be valid. */
conf_port = conf->ports[slot];
+ if (conf_port == NULL) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
info->slot = slot;
info->name = conf_port->name;
@@ -1179,6 +1203,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_port_info( pjmedia_conf *conf,
info->tx_adj_level = conf_port->tx_adj_level - NORMAL_LEVEL;
info->rx_adj_level = conf_port->rx_adj_level - NORMAL_LEVEL;
+ /* Unlock mutex */
+ pj_mutex_unlock(conf->mutex);
+
return PJ_SUCCESS;
}
@@ -1191,6 +1218,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_ports_info(pjmedia_conf *conf,
PJ_ASSERT_RETURN(conf && size && info, PJ_EINVAL);
+ /* Lock mutex */
+ pj_mutex_lock(conf->mutex);
+
for (i=0; i<conf->max_ports && count<*size; ++i) {
if (!conf->ports[i])
continue;
@@ -1199,6 +1229,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_ports_info(pjmedia_conf *conf,
++count;
}
+ /* Unlock mutex */
+ pj_mutex_unlock(conf->mutex);
+
*size = count;
return PJ_SUCCESS;
}
@@ -1217,10 +1250,15 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_signal_level( pjmedia_conf *conf,
/* Check arguments */
PJ_ASSERT_RETURN(conf && slot<conf->max_ports, PJ_EINVAL);
- /* Port must be valid. */
- PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL);
+ /* Lock mutex */
+ pj_mutex_lock(conf->mutex);
+ /* Port must be valid. */
conf_port = conf->ports[slot];
+ if (conf_port == NULL) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
if (tx_level != NULL) {
*tx_level = conf_port->tx_level;
@@ -1229,6 +1267,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_signal_level( pjmedia_conf *conf,
if (rx_level != NULL)
*rx_level = conf_port->rx_level;
+ /* Unlock mutex */
+ pj_mutex_unlock(conf->mutex);
+
return PJ_SUCCESS;
}
@@ -1245,20 +1286,28 @@ PJ_DEF(pj_status_t) pjmedia_conf_adjust_rx_level( pjmedia_conf *conf,
/* Check arguments */
PJ_ASSERT_RETURN(conf && slot<conf->max_ports, PJ_EINVAL);
- /* Port must be valid. */
- PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL);
-
/* Value must be from -128 to +127 */
/* Disabled, you can put more than +127, at your own risk:
PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL);
*/
PJ_ASSERT_RETURN(adj_level >= -128, PJ_EINVAL);
+ /* Lock mutex */
+ pj_mutex_lock(conf->mutex);
+
+ /* Port must be valid. */
conf_port = conf->ports[slot];
+ if (conf_port == NULL) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
/* Set normalized adjustment level. */
conf_port->rx_adj_level = adj_level + NORMAL_LEVEL;
+ /* Unlock mutex */
+ pj_mutex_unlock(conf->mutex);
+
return PJ_SUCCESS;
}
@@ -1275,20 +1324,28 @@ PJ_DEF(pj_status_t) pjmedia_conf_adjust_tx_level( pjmedia_conf *conf,
/* Check arguments */
PJ_ASSERT_RETURN(conf && slot<conf->max_ports, PJ_EINVAL);
- /* Port must be valid. */
- PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL);
-
/* Value must be from -128 to +127 */
/* Disabled, you can put more than +127,, at your own risk:
PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL);
*/
PJ_ASSERT_RETURN(adj_level >= -128, PJ_EINVAL);
+ /* Lock mutex */
+ pj_mutex_lock(conf->mutex);
+
+ /* Port must be valid. */
conf_port = conf->ports[slot];
+ if (conf_port == NULL) {
+ pj_mutex_unlock(conf->mutex);
+ return PJ_EINVAL;
+ }
/* Set normalized adjustment level. */
conf_port->tx_adj_level = adj_level + NORMAL_LEVEL;
+ /* Unlock mutex */
+ pj_mutex_unlock(conf->mutex);
+
return PJ_SUCCESS;
}