[sr-dev] git:master: 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 .

Charles Chance charles.chance at sipcentric.com
Thu Oct 24 13:20:46 CEST 2013


Module: sip-router
Branch: master
Commit: adfa299a1a01aba1c69c1129d78170056d50db42
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=adfa299a1a01aba1c69c1129d78170056d50db42

Author: Charles Chance <charles.chance at sipcentric.com>
Committer: Charles Chance <charles.chance at 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);




More information about the sr-dev mailing list