1 /*
2 ** 2011-08-18
3 **
4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
6 **
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 **
13 ** Helper routines for memory allocation.
14 */
15 #include "lsmInt.h"
16
17 /*
18 ** The following routines are called internally by LSM sub-routines. In
19 ** this case a valid environment pointer must be supplied.
20 */
lsmMalloc(lsm_env * pEnv,size_t N)21 void *lsmMalloc(lsm_env *pEnv, size_t N){
22 assert( pEnv );
23 return pEnv->xMalloc(pEnv, N);
24 }
lsmFree(lsm_env * pEnv,void * p)25 void lsmFree(lsm_env *pEnv, void *p){
26 assert( pEnv );
27 pEnv->xFree(pEnv, p);
28 }
lsmRealloc(lsm_env * pEnv,void * p,size_t N)29 void *lsmRealloc(lsm_env *pEnv, void *p, size_t N){
30 assert( pEnv );
31 return pEnv->xRealloc(pEnv, p, N);
32 }
33
34 /*
35 ** Core memory allocation routines for LSM.
36 */
lsm_malloc(lsm_env * pEnv,size_t N)37 void *lsm_malloc(lsm_env *pEnv, size_t N){
38 return lsmMalloc(pEnv ? pEnv : lsm_default_env(), N);
39 }
lsm_free(lsm_env * pEnv,void * p)40 void lsm_free(lsm_env *pEnv, void *p){
41 lsmFree(pEnv ? pEnv : lsm_default_env(), p);
42 }
lsm_realloc(lsm_env * pEnv,void * p,size_t N)43 void *lsm_realloc(lsm_env *pEnv, void *p, size_t N){
44 return lsmRealloc(pEnv ? pEnv : lsm_default_env(), p, N);
45 }
46
lsmMallocZero(lsm_env * pEnv,size_t N)47 void *lsmMallocZero(lsm_env *pEnv, size_t N){
48 void *pRet;
49 assert( pEnv );
50 pRet = lsmMalloc(pEnv, N);
51 if( pRet ) memset(pRet, 0, N);
52 return pRet;
53 }
54
lsmMallocRc(lsm_env * pEnv,size_t N,int * pRc)55 void *lsmMallocRc(lsm_env *pEnv, size_t N, int *pRc){
56 void *pRet = 0;
57 if( *pRc==LSM_OK ){
58 pRet = lsmMalloc(pEnv, N);
59 if( pRet==0 ){
60 *pRc = LSM_NOMEM_BKPT;
61 }
62 }
63 return pRet;
64 }
65
lsmMallocZeroRc(lsm_env * pEnv,size_t N,int * pRc)66 void *lsmMallocZeroRc(lsm_env *pEnv, size_t N, int *pRc){
67 void *pRet = 0;
68 if( *pRc==LSM_OK ){
69 pRet = lsmMallocZero(pEnv, N);
70 if( pRet==0 ){
71 *pRc = LSM_NOMEM_BKPT;
72 }
73 }
74 return pRet;
75 }
76
lsmReallocOrFree(lsm_env * pEnv,void * p,size_t N)77 void *lsmReallocOrFree(lsm_env *pEnv, void *p, size_t N){
78 void *pNew;
79 pNew = lsm_realloc(pEnv, p, N);
80 if( !pNew ) lsm_free(pEnv, p);
81 return pNew;
82 }
83
lsmReallocOrFreeRc(lsm_env * pEnv,void * p,size_t N,int * pRc)84 void *lsmReallocOrFreeRc(lsm_env *pEnv, void *p, size_t N, int *pRc){
85 void *pRet = 0;
86 if( *pRc ){
87 lsmFree(pEnv, p);
88 }else{
89 pRet = lsmReallocOrFree(pEnv, p, N);
90 if( !pRet ) *pRc = LSM_NOMEM_BKPT;
91 }
92 return pRet;
93 }
94
lsmMallocStrdup(lsm_env * pEnv,const char * zIn)95 char *lsmMallocStrdup(lsm_env *pEnv, const char *zIn){
96 int nByte;
97 char *zRet;
98 nByte = strlen(zIn);
99 zRet = lsmMalloc(pEnv, nByte+1);
100 if( zRet ){
101 memcpy(zRet, zIn, nByte+1);
102 }
103 return zRet;
104 }
105