Remove mass calloc() on memcached_st creation.
[m6w6/libmemcached] / libmemcached / allocators.c
1 #include "common.h"
2
3 void libmemcached_free(const memcached_st *ptr, void *mem)
4 {
5 (void) ptr;
6 free(mem);
7 }
8
9 void *libmemcached_malloc(const memcached_st *ptr, size_t size)
10 {
11 (void) ptr;
12 return malloc(size);
13 }
14
15 void *libmemcached_realloc(const memcached_st *ptr, void *mem, size_t size)
16 {
17 (void) ptr;
18 return realloc(mem, size);
19 }
20
21 void *libmemcached_calloc(const memcached_st *ptr, size_t nelem, size_t size)
22 {
23 if (ptr->call_malloc != libmemcached_malloc)
24 {
25 void *ret = libmemcached_malloc(ptr, nelem * size);
26 if (ret != NULL)
27 memset(ret, 0, nelem * size);
28
29 return ret;
30 }
31
32 return calloc(nelem, size);
33 }
34
35 memcached_return_t memcached_set_memory_allocators(memcached_st *ptr,
36 memcached_malloc_fn mem_malloc,
37 memcached_free_fn mem_free,
38 memcached_realloc_fn mem_realloc,
39 memcached_calloc_fn mem_calloc)
40 {
41 /* All should be set, or none should be set */
42 if (mem_malloc == NULL && mem_free == NULL && mem_realloc == NULL && mem_calloc == NULL)
43 {
44 ptr->call_malloc= libmemcached_malloc;
45 ptr->call_free= libmemcached_free;
46 ptr->call_realloc= libmemcached_realloc;
47 ptr->call_calloc= libmemcached_calloc;
48 }
49 else if (mem_malloc == NULL || mem_free == NULL || mem_realloc == NULL || mem_calloc == NULL)
50 {
51 return MEMCACHED_FAILURE;
52 }
53 else
54 {
55 ptr->call_malloc= mem_malloc;
56 ptr->call_free= mem_free;
57 ptr->call_realloc= mem_realloc;
58 ptr->call_calloc= mem_calloc;
59 }
60
61 return MEMCACHED_SUCCESS;
62 }
63
64 void memcached_get_memory_allocators(const memcached_st *ptr,
65 memcached_malloc_fn *mem_malloc,
66 memcached_free_fn *mem_free,
67 memcached_realloc_fn *mem_realloc,
68 memcached_calloc_fn *mem_calloc)
69 {
70 *mem_malloc= ptr->call_malloc;
71 *mem_free= ptr->call_free;
72 *mem_realloc= ptr->call_realloc;
73 *mem_calloc= ptr->call_calloc;
74 }