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