path: root/src
diff options
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-09-16 00:15:56 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-09-27 11:46:38 +0200
commitf45334be29016a36594aacc07c90e262e4994525 (patch)
tree14fe8909b0123dd211e30654dffc77fe05b01615 /src
parent8319a6799ffc9d4c5e7e094b96af30cbebf89f65 (diff)
msgb: add msgb_talloc_ctx_init(), deprecate msgb_set_talloc_ctx()
So far each and every main() scope creates a msgb talloc context and either passes it to msgb_set_talloc_ctx() or sets tall_msgb_ctx directly (by defining it extern first). Remove some code duplication: add one central function that creates the "msgb" talloc context for all. Most users of msgb employ a talloc_named_const(), but osmo-bts uses a talloc_pool() instead. Offer both ways by means of the pool_size argument, and for both ways make sure the context is called "msgb". Suggest that msgb users should move to this new function: deprecate msgb_set_talloc_ctx(). To be able to do so, include core/defs.h in msgb.h. There's a tradeoff between hiding the msgb talloc context behind API that tries to guess all use cases versus avoiding code dup. This patch opts against code dup and boldly assumes that all future use is covered. Also, the new function suggests to not access tall_msgb_ctx directly, which can be considered a style improvement. It seems that not all main scopes that use msgb actually initialize the msgb ctx. As a fallback for these, explicitly initialize tall_msgb_ctx to NULL. Change-Id: I747fbbf977c4d2c868c8dead64cfc5fd86eb8d4c
Diffstat (limited to 'src')
1 files changed, 20 insertions, 1 deletions
diff --git a/src/msgb.c b/src/msgb.c
index ea8dc827..a27100c6 100644
--- a/src/msgb.c
+++ b/src/msgb.c
@@ -35,7 +35,7 @@
#include <osmocom/core/talloc.h>
//#include <openbsc/debug.h>
-void *tall_msgb_ctx;
+void *tall_msgb_ctx = NULL;
/*! \brief Allocate a new message buffer
* \param[in] size Length in octets, including headroom
@@ -151,6 +151,7 @@ uint16_t msgb_length(const struct msgb *msg)
/*! \brief Set the talloc context for \ref msgb_alloc
+ * Deprecated, use msgb_talloc_ctx_init() instead.
* \param[in] ctx talloc context to be used as root for msgb allocations
void msgb_set_talloc_ctx(void *ctx)
@@ -158,6 +159,24 @@ void msgb_set_talloc_ctx(void *ctx)
tall_msgb_ctx = ctx;
+/*! \brief Initialize a msgb talloc context for \ref msgb_alloc.
+ * Create a talloc context called "msgb". If \a pool_size is 0, create a named
+ * const as msgb talloc context. If \a pool_size is nonzero, create a talloc
+ * pool, possibly for faster msgb allocations (see talloc_pool()).
+ * \param[in] root_ctx talloc context used as parent for the new "msgb" ctx.
+ * \param[in] pool_size if nonzero, create a talloc pool of this size.
+ * \returns the new msgb talloc context, e.g. for reporting
+ */
+void *msgb_talloc_ctx_init(void *root_ctx, unsigned int pool_size)
+ if (!pool_size)
+ tall_msgb_ctx = talloc_size(root_ctx, 0);
+ else
+ tall_msgb_ctx = talloc_pool(root_ctx, pool_size);
+ talloc_set_name_const(tall_msgb_ctx, "msgb");
+ return tall_msgb_ctx;
/*! \brief Copy an msgb.
* This function allocates a new msgb, copies the data buffer of msg,