[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 .

Peter Dunkley peter.dunkley at crocodilertc.net
Thu Oct 24 13:24:08 CEST 2013


Excellent!

Thanks for this,

Peter


On 24 October 2013 12:20, Charles Chance <charles.chance at sipcentric.com>wrote:

> 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);
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
>



-- 
Peter Dunkley
Technical Director
Crocodile RCS Ltd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-dev/attachments/20131024/b941d2a7/attachment-0001.html>


More information about the sr-dev mailing list