pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-mgw/+/29749 )
Change subject: mgcp-client: Rearrange internal backpointers ......................................................................
mgcp-client: Rearrange internal backpointers
Let's properly store backpointers so that it is easy to access all relation chain (pool<->pool_member<->mgcp_client).
Related: SYS#5987 Change-Id: I5ec2465075da2e3c8eabca9df60681620a7db499 --- M include/osmocom/mgcp_client/mgcp_client_internal.h M include/osmocom/mgcp_client/mgcp_client_pool_internal.h M src/libosmo-mgcp-client/mgcp_client_pool.c M src/libosmo-mgcp-client/mgcp_client_vty.c 4 files changed, 16 insertions(+), 18 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/49/29749/1
diff --git a/include/osmocom/mgcp_client/mgcp_client_internal.h b/include/osmocom/mgcp_client/mgcp_client_internal.h index 73e3de2..2eb9b4c 100644 --- a/include/osmocom/mgcp_client/mgcp_client_internal.h +++ b/include/osmocom/mgcp_client/mgcp_client_internal.h @@ -16,7 +16,7 @@ mgcp_trans_id_t next_trans_id; struct llist_head responses_pending; struct llist_head inuse_endpoints; - struct mgcp_client_pool *pool; + struct mgcp_client_pool_member *pool_member; };
struct mgcp_inuse_endpoint { diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h index 91e5a45..d71deaf 100644 --- a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h +++ b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h @@ -26,6 +26,9 @@ /* Entry in llist mgcp_client_pool->pool. */ struct llist_head list;
+ /* The pool managing this object: */ + struct mgcp_client_pool *pool; + /* Reference number assinged by VTY. This number is used to manage the pool from the VTY and to identify it in * the log. */ unsigned int nr; @@ -48,5 +51,5 @@
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); -int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member, struct mgcp_client_pool *pool); +int mgcp_client_pool_member_reinit_client(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 b3cc35d..b62b40f 100644 --- a/src/libosmo-mgcp-client/mgcp_client_pool.c +++ b/src/libosmo-mgcp-client/mgcp_client_pool.c @@ -55,7 +55,7 @@ llist_for_each_entry(pool_member, &pool->member_list, list) {
/* Initialize client */ - if (mgcp_client_pool_member_reinit_client(pool_member, pool) == 0) + if (mgcp_client_pool_member_reinit_client(pool_member) == 0) pool_members_initialized++; }
@@ -165,25 +165,19 @@ void mgcp_client_pool_put(struct mgcp_client *mgcp_client) { struct mgcp_client_pool_member *pool_member; - struct mgcp_client_pool *pool;
if (!mgcp_client) return;
- if (mgcp_client->pool) - pool = mgcp_client->pool; - else + if (!mgcp_client->pool_member) return; + pool_member = mgcp_client->pool_member;
- llist_for_each_entry(pool_member, &pool->member_list, list) { - if (pool_member->client == mgcp_client) { - if (pool_member->refcount == 0) { - LOGPPMGW(pool_member, LOGL_ERROR, "MGW pool member has invalid refcount\n"); - return; - } - pool_member->refcount--; - } + if (pool_member->refcount == 0) { + LOGPPMGW(pool_member, LOGL_ERROR, "MGW pool member has invalid refcount\n"); + return; } + pool_member->refcount--; }
/*************************** @@ -201,6 +195,7 @@ pool_member = talloc_zero(pool, struct mgcp_client_pool_member); OSMO_ASSERT(pool_member); mgcp_client_conf_init(&pool_member->conf); + pool_member->pool = pool; pool_member->nr = nr; llist_add_tail(&pool_member->list, &pool->member_list); return pool_member; @@ -224,7 +219,7 @@ /*! Recreate and reconnect the MGCP client associated to the pool descriptor. * \param[in] pool_member MGCP client pool descriptor. */ -int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member, struct mgcp_client_pool *pool) +int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member) { /* Get rid of a possibly existing old MGCP client instance first */ if (pool_member->client) { @@ -240,7 +235,7 @@ }
/* Set backpointer so that we can detect later that this MGCP client is managed by this pool. */ - pool_member->client->pool = pool; + pool_member->client->pool_member = pool_member;
/* Connect client */ if (mgcp_client_connect2(pool_member->client, 0)) { diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c index 81f8f3e..a823b0c 100644 --- a/src/libosmo-mgcp-client/mgcp_client_vty.c +++ b/src/libosmo-mgcp-client/mgcp_client_vty.c @@ -401,7 +401,7 @@ return CMD_WARNING; }
- if (mgcp_client_pool_member_reinit_client(pool_member, global_mgcp_client_pool) < 0) { + if (mgcp_client_pool_member_reinit_client(pool_member) < 0) { LOGP(DLMGCP, LOGL_ERROR, "(manual) MGW %s connect failed at (%s:%u)\n", mgcp_client_pool_member_name(pool_member), pool_member->conf.remote_addr, pool_member->conf.remote_port);