diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h index 148a5cf02..582090c3d 100644 --- a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h +++ b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h @@ -45,4 +45,6 @@ struct mgcp_client_pool { struct mgcp_client_pool_member *mgcp_client_pool_find_member_by_nr(struct mgcp_client_pool *pool, unsigned int nr); +struct mgcp_client_pool_member *mgcp_client_pool_member_alloc(struct mgcp_client_pool *pool, unsigned int nr); +void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member); const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member); diff --git a/src/libosmo-mgcp-client/mgcp_client_pool.c b/src/libosmo-mgcp-client/mgcp_client_pool.c index 0555ff3c9..c8282fe6b 100644 --- a/src/libosmo-mgcp-client/mgcp_client_pool.c +++ b/src/libosmo-mgcp-client/mgcp_client_pool.c @@ -228,3 +228,38 @@ void mgcp_client_pool_put(struct mgcp_client *mgcp_client) } } } + +/*************************** + * mgcp_client_pool_member: + ***************************/ + +/*! Allocate an mgcp_client_pool_member. + * \param[in] pool MGCP client pool descriptor. + * \param[in] nr Reference number of the pool member. + */ +struct mgcp_client_pool_member *mgcp_client_pool_member_alloc(struct mgcp_client_pool *pool, unsigned int nr) +{ + struct mgcp_client_pool_member *pool_member; + + pool_member = talloc_zero(pool, struct mgcp_client_pool_member); + OSMO_ASSERT(pool_member); + mgcp_client_conf_init(&pool_member->conf); + pool_member->nr = nr; + llist_add_tail(&pool_member->list, &pool->member_list); + return pool_member; +} + +/*! Free an mgcp_client_pool_member allocated through mgcp_client_pool_member_alloc(). + * \param[in] pool_member MGCP client pool descriptor. + * + * It also frees the associated MGCP client if present. + */ +void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member) +{ + llist_del(&pool_member->list); + if (pool_member->client) { + mgcp_client_disconnect(pool_member->client); + talloc_free(pool_member->client); + } + talloc_free(pool_member); +} diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c index 748042f92..505f3ab99 100644 --- a/src/libosmo-mgcp-client/mgcp_client_vty.c +++ b/src/libosmo-mgcp-client/mgcp_client_vty.c @@ -345,11 +345,8 @@ DEFUN_ATTR(cfg_mgw, pool_member = mgcp_client_pool_find_member_by_nr(global_mgcp_client_pool, nr); if (!pool_member) { - pool_member = talloc_zero(global_mgcp_client_pool, struct mgcp_client_pool_member); + pool_member = mgcp_client_pool_member_alloc(global_mgcp_client_pool, nr); OSMO_ASSERT(pool_member); - mgcp_client_conf_init(&pool_member->conf); - pool_member->nr = nr; - llist_add_tail(&pool_member->list, &global_mgcp_client_pool->member_list); } vty->index = &pool_member->conf; @@ -379,12 +376,7 @@ DEFUN_ATTR(cfg_no_mgw, return CMD_WARNING; } - llist_del(&pool_member->list); - if (pool_member->client) { - mgcp_client_disconnect(pool_member->client); - talloc_free(pool_member->client); - } - talloc_free(pool_member); + mgcp_client_pool_member_free(pool_member); return CMD_SUCCESS; }