mgcp-client: Create alloc() and free() internal APIs for mgcp_client_pool_member
Related: SYS#5987
Change-Id: Ibd2bf976885c777fe944652af6fe6eb0f1820468
diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
index 148a5cf..582090c 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_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 0555ff3..c8282fe 100644
--- a/src/libosmo-mgcp-client/mgcp_client_pool.c
+++ b/src/libosmo-mgcp-client/mgcp_client_pool.c
@@ -228,3 +228,38 @@
}
}
}
+
+/***************************
+ * 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 748042f..505f3ab 100644
--- a/src/libosmo-mgcp-client/mgcp_client_vty.c
+++ b/src/libosmo-mgcp-client/mgcp_client_vty.c
@@ -345,11 +345,8 @@
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 @@
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;
}