Excellent!
Thanks for this,
Peter
On 24 October 2013 12:20, Charles Chance charles.chance@sipcentric.comwrote:
Module: sip-router Branch: master Commit: adfa299a1a01aba1c69c1129d78170056d50db42 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=adfa299a...
Author: Charles Chance charles.chance@sipcentric.com Committer: Charles Chance charles.chance@sipcentric.com Date: Thu Oct 24 12:14:38 2013 +0100
memcached: added alternate memory management wrappers for backwards compatibility with older libmemcached versions and added preprocessor check for the correct ones to use based on installed version.
modules/memcached/memcached.c | 82 +++++++++++++++++++++++++++++++++++------ 1 files changed, 70 insertions(+), 12 deletions(-)
diff --git a/modules/memcached/memcached.c b/modules/memcached/memcached.c index 431cf4e..0815d63 100644 --- a/modules/memcached/memcached.c +++ b/modules/memcached/memcached.c @@ -106,7 +106,7 @@ struct module_exports exports = {
/*!
- \brief Wrapper functions around our internal memory management for
libmemcache callback
- \brief Wrapper functions around our internal memory management for
libmemcached (version >= 0.38) callback
- \param mem freed memory
- \note pkg_free does not allow NULL pointer as standard free, therefore
we check it here
- \see pkg_free
@@ -116,9 +116,20 @@ static inline void mcd_free(memcached_st *ptr, void *mem, void *context) { pkg_free(mem); }
+/*!
- \brief Wrapper functions around our internal memory management for
libmemcached (version < 0.38) callback
- \param mem freed memory
- \note pkg_free does not allow NULL pointer as standard free, therefore
we check it here
- \see pkg_free
- */
- static inline void mcd_free_compat(memcached_st *ptr, void *mem) {
if (mem)
pkg_free(mem);
+}
/*!
- \brief Wrapper functions around our internal memory management for
libmemcache callback
- \brief Wrapper functions around our internal memory management for
libmemcached (version >= 0.38) callback
- \param size allocated size
- \return allocated memory, or NULL on failure
- \see pkg_malloc
@@ -127,9 +138,19 @@ static inline void* mcd_malloc(memcached_st *ptr, const size_t size, void *conte return pkg_malloc(size); }
+/*!
- \brief Wrapper functions around our internal memory management for
libmemcached (version < 0.38) callback
- \param size allocated size
- \return allocated memory, or NULL on failure
- \see pkg_malloc
- */
- static inline void* mcd_malloc_compat(memcached_st *ptr, const size_t
size) {
return pkg_malloc(size);
+}
/*!
- \brief Wrapper functions around our internal memory management for
libmemcache callback
- \brief Wrapper functions around our internal memory management for
libmemcached (version >= 0.38) callback
- \param mem pointer to allocated memory
- \param size new size of memory area
- \return allocated memory, or NULL on failure
@@ -139,9 +160,20 @@ static inline void* mcd_realloc(memcached_st *ptr, void *mem, const size_t size, return pkg_realloc(mem, size); }
+/*!
- \brief Wrapper functions around our internal memory management for
libmemcached (version < 0.38) callback
- \param mem pointer to allocated memory
- \param size new size of memory area
- \return allocated memory, or NULL on failure
- \see pkg_realloc
- */
+static inline void* mcd_realloc_compat(memcached_st *ptr, void *mem, const size_t size) {
return pkg_realloc(mem, size);
+}
/*!
- \brief Wrapper functions around our internal memory management for
libmemcache callback
- \brief Wrapper functions around our internal memory management for
libmemcached (version >= 0.38) callback
- \param mem pointer to allocated memory
- \param size new size of memory area
- \return allocated memory, or NULL on failure
@@ -157,6 +189,24 @@ static inline void * mcd_calloc(memcached_st *ptr, size_t nelem, const size_t el return tmp; }
+/*!
- \brief Wrapper functions around our internal memory management for
libmemcached (version < 0.38) callback
- \param mem pointer to allocated memory
- \param size new size of memory area
- \return allocated memory, or NULL on failure
- \see pkg_malloc
- \todo this is not optimal, use internal calloc implemention which is
not exported yet
- */
+static inline void * mcd_calloc_compat(memcached_st *ptr, size_t nelem, const size_t elsize) {
void* tmp = NULL;
tmp = pkg_malloc(nelem * elsize);
if (tmp != NULL) {
memset(tmp, 0, nelem * elsize);
}
return tmp;
+}
/**
- \brief Callback to check if we could connect successfully to a server
- \param ptr memcached handler
@@ -206,25 +256,33 @@ static int mod_init(void) { } LM_DBG("allocated new server handle at %p", memcached_h);
if (mcd_memory == 1) {
LM_INFO("Use internal kamailio memory manager for
memcached client library");
rc = memcached_set_memory_allocators(memcached_h,
(memcached_malloc_fn)mcd_malloc,
(memcached_free_fn)mcd_free,
(memcached_realloc_fn)mcd_realloc,
(memcached_calloc_fn)mcd_calloc, NULL);
if (mcd_memory == 1) {
LM_INFO("Use internal kamailio memory manager for
memcached client library\n");
+#if LIBMEMCACHED_VERSION_HEX >= 0x00038000
rc = memcached_set_memory_allocators(memcached_h,
(memcached_malloc_fn)mcd_malloc,
(memcached_free_fn)mcd_free,
(memcached_realloc_fn)mcd_realloc,
(memcached_calloc_fn)mcd_calloc, NULL); +#else
rc = memcached_set_memory_allocators(memcached_h,
(memcached_malloc_function)mcd_malloc_compat,
(memcached_free_function)mcd_free_compat, (memcached_realloc_function)mcd_realloc_compat,
(memcached_calloc_function)mcd_calloc_compat); +#endif
if (rc == MEMCACHED_SUCCESS) {
LM_DBG("memory manager callbacks set");
LM_DBG("memory manager callbacks set\n"); } else { LM_ERR("memory manager callbacks not set, returned
%s.\n", memcached_strerror(memcached_h, rc)); return -1; } } else {
LM_INFO("Use system memory manager for memcached client
library");
LM_INFO("Use system memory manager for memcached client
library\n"); }
servers = memcached_server_list_append(servers, server,
atoi(port), &rc);
if (memcached_behavior_set(memcached_h,
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, mcd_timeout) != MEMCACHED_SUCCESS) {
LM_ERR("could not set server connection timeout");
LM_ERR("could not set server connection timeout\n"); return -1; } rc = memcached_server_push(memcached_h, servers);
sr-dev mailing list sr-dev@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev