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)
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
2 files changed, 24 insertions, 2 deletions
diff --git a/include/osmocom/core/msgb.h b/include/osmocom/core/msgb.h
index 6f617e28..7c857710 100644
--- a/include/osmocom/core/msgb.h
+++ b/include/osmocom/core/msgb.h
@@ -23,6 +23,7 @@
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/bits.h>
+#include <osmocom/core/defs.h>
/*! \defgroup msgb Message buffers
* @{
@@ -457,6 +458,8 @@ static inline int msgb_test_invariant(const struct msgb *msg)
/* non inline functions to ease binding */
uint8_t *msgb_data(const struct msgb *msg);
-void msgb_set_talloc_ctx(void *ctx);
+void *msgb_talloc_ctx_init(void *root_ctx, unsigned int pool_size);
+void msgb_set_talloc_ctx(void *ctx) OSMO_DEPRECATED("Use msgb_talloc_ctx_init() instead");
/*! @} */
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,