1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
// =============================================================== //
// //
// File : gb_memory.h //
// Purpose : //
// //
// Institute of Microbiology (Technical University Munich) //
// http://www.arb-home.de/ //
// //
// =============================================================== //
#ifndef GB_MEMORY_H
#define GB_MEMORY_H
#if defined(DEBUG)
#define MEMORY_TEST 1
// MEMORY_TEST == 1 uses malloc and normal pointers for internal ARBDB memory
// -> memory checkers like valgrand work
// -> loading DB is slower (file must be parsed completely)
#else
#define MEMORY_TEST 0
// MEMORY_TEST == 0 uses own allocation and relative pointers for internal ARBDB memory
// -> memory checkers like valgrand won't be very useful
// -> debugging is difficult, cause it's difficult to follow pointers
// -> DB loads w/o delay, cause it's mmap'ped into memory
#endif
#if defined(UNIT_TESTS) // UT_DIFF
#undef MEMORY_TEST
#define MEMORY_TEST 0 // test mmapped-DB version in unittests (recommended setting; same as in RELEASE)
// #define MEMORY_TEST 1 // test DEBUG DB version in unittests
#endif
struct gb_if_entries;
struct gb_index_files;
struct gb_header_list;
struct GBDATA;
struct GBCONTAINER;
#if (MEMORY_TEST==1)
typedef void *GB_REL_ADD;
typedef char *GB_REL_STRING;
typedef GBDATA *GB_REL_GBDATA; // @@@ use GBENTRY?
typedef GBCONTAINER *GB_REL_CONTAINER;
typedef gb_header_list *GB_REL_HLS;
typedef gb_if_entries *GB_REL_IFES;
typedef gb_index_files *GB_REL_IFS;
typedef gb_if_entries **GB_REL_PIFES;
#define UNUSED_IN_MEMTEST(param) param = param
#else
typedef long GB_REL_ADD;
typedef long GB_REL_STRING;
typedef long GB_REL_GBDATA;
typedef long GB_REL_CONTAINER;
typedef long GB_REL_HLS;
typedef long GB_REL_IFES;
typedef long GB_REL_IFS;
typedef long GB_REL_PIFES;
#endif
// -------------------------------
// GB_RESOLVE / GB_SETREL
//
// set GB_REL_* "pointers"
#if (MEMORY_TEST==1)
#define GB_RESOLVE(typ, struct_add, member_name) ((typ)((struct_add)->member_name))
#define GB_SETREL(struct_add, member_name, address) (struct_add)->member_name = (address)
#else
#define GB_RESOLVE(typ, struct_add, member_name) \
((typ)(((struct_add)->member_name) \
? (typ) (((char*)(struct_add))+((struct_add)->member_name)) \
: NULL))
#define GB_SETREL(struct_add, member_name, address) \
do { \
char *pntr = (char *)(address); \
if (pntr) { \
(struct_add)->member_name = (char*)(pntr)-(char*)(struct_add); \
} \
else { \
(struct_add)->member_name = 0; \
} \
} while (0)
#endif
// --------------------------------
// ARBDB memory functions
enum ARB_MEMORY_INDEX {
GBM_CB_INDEX = -1, // Note: historical name. originally was used to allocate database-callback-memory (which is now done with new and delete)
GBM_HASH_INDEX = -2,
GBM_HEADER_INDEX = -3,
GBM_UNDO = -4,
GBM_DICT_INDEX = -5,
GBM_USER_INDEX = -6
};
// gbm_get_mem returns a block filled with zero (like calloc() does)
#if defined(DEBUG)
#if defined(DEVEL_RALF)
#define FILL_MEM_ON_FREE 0xdb
#endif
#endif
#if (MEMORY_TEST==1)
void *GB_calloc(unsigned int nelem, unsigned int elsize);
inline void *gbm_get_mem(size_t size, long ) { return (char*)GB_calloc(1, size); }
#if defined(FILL_MEM_ON_FREE)
inline void gbm_free_mem(void *block, size_t size, long ) { memset(block, FILL_MEM_ON_FREE, size); free(block); }
#else // !defined(FILL_MEM_ON_FREE)
inline void gbm_free_mem(void *block, size_t , long ) { free(block); }
#endif
#else
void *gbmGetMemImpl(size_t size, long index);
void gbmFreeMemImpl(void *data, size_t size, long index);
inline void *gbm_get_mem(size_t size, long index) { return gbmGetMemImpl(size, index); }
inline void gbm_free_mem(void *block, size_t size, long index) {
#if defined(FILL_MEM_ON_FREE)
memset(block, FILL_MEM_ON_FREE, size);
#endif
gbmFreeMemImpl(block, size, index);
}
#endif
#else
#error gb_memory.h included twice
#endif // GB_MEMORY_H
|