Rearranged some things and added the visibility.m4 macros. Started to lay the
[m6w6/libmemcached] / libmemcached / memcached_allocators.c
1 #include "common.h"
2
3 void libmemcached_free(memcached_st *ptr, void *mem)
4 {
5 (void) ptr;
6 free(mem);
7 }
8
9 void *libmemcached_malloc(memcached_st *ptr, size_t size)
10 {
11 (void) ptr;
12 return malloc(size);
13 }
14
15 void *libmemcached_realloc(memcached_st *ptr, void *mem, size_t size)
16 {
17 (void) ptr;
18 return realloc(mem, size);
19 }
20
21 void *libmemcached_calloc(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 memcached_set_memory_allocators(memcached_st *ptr,
36 memcached_malloc_function mem_malloc,
37 memcached_free_function mem_free,
38 memcached_realloc_function mem_realloc,
39 memcached_calloc_function 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 return MEMCACHED_FAILURE;
51 else
52 {
53 ptr->call_malloc= mem_malloc;
54 ptr->call_free= mem_free;
55 ptr->call_realloc= mem_realloc;
56 ptr->call_calloc= mem_calloc;
57 }
58
59 return MEMCACHED_SUCCESS;
60 }
61
62 void memcached_get_memory_allocators(memcached_st *ptr,
63 memcached_malloc_function *mem_malloc,
64 memcached_free_function *mem_free,
65 memcached_realloc_function *mem_realloc,
66 memcached_calloc_function *mem_calloc)
67 {
68 *mem_malloc= ptr->call_malloc;
69 *mem_free= ptr->call_free;
70 *mem_realloc= ptr->call_realloc;
71 *mem_calloc= ptr->call_calloc;
72 }