1 /* 2 Bacula(R) - The Network Backup Solution 3 4 Copyright (C) 2000-2020 Kern Sibbald 5 6 The original author of Bacula is Kern Sibbald, with contributions 7 from many others, a complete list can be found in the file AUTHORS. 8 9 You may use this file and others of this release according to the 10 license defined in the LICENSE file, which includes the Affero General 11 Public License, v3.0 ("AGPLv3") and some additional permissions and 12 terms pursuant to its AGPLv3 Section 7. 13 14 This notice must be preserved when any source code is 15 conveyed and/or propagated. 16 17 Bacula(R) is a registered trademark of Kern Sibbald. 18 */ 19 /* 20 * Memory Pool prototypes 21 * 22 * Kern Sibbald, MM 23 * 24 */ 25 26 #ifndef __MEM_POOL_H_ 27 #define __MEM_POOL_H_ 28 29 30 #ifdef SMARTALLOC 31 32 #define get_pool_memory(pool) sm_get_pool_memory(__FILE__, __LINE__, pool) 33 extern POOLMEM *sm_get_pool_memory(const char *file, int line, int pool); 34 35 #define get_memory(size) sm_get_memory(__FILE__, __LINE__, size) 36 extern POOLMEM *sm_get_memory(const char *fname, int line, int32_t size); 37 38 #define sizeof_pool_memory(buf) sm_sizeof_pool_memory(__FILE__, __LINE__, buf) 39 extern int32_t sm_sizeof_pool_memory(const char *fname, int line, POOLMEM *buf); 40 41 #define realloc_pool_memory(buf,size) sm_realloc_pool_memory(__FILE__, __LINE__, buf, size) 42 extern POOLMEM *sm_realloc_pool_memory(const char *fname, int line, POOLMEM *buf, int32_t size); 43 44 #define check_pool_memory_size(buf,size) sm_check_pool_memory_size(__FILE__, __LINE__, buf, size) 45 extern POOLMEM *sm_check_pool_memory_size(const char *fname, int line, POOLMEM *buf, int32_t size); 46 47 #define free_pool_memory(x) sm_free_pool_memory(__FILE__, __LINE__, x) 48 #define free_memory(x) sm_free_pool_memory(__FILE__, __LINE__, x) 49 extern void sm_free_pool_memory(const char *fname, int line, POOLMEM *buf); 50 51 #else 52 53 extern POOLMEM *get_pool_memory(int pool); 54 extern POOLMEM *get_memory(int32_t size); 55 extern int32_t sizeof_pool_memory(POOLMEM *buf); 56 extern POOLMEM *realloc_pool_memory(POOLMEM *buf, int32_t size); 57 extern POOLMEM *check_pool_memory_size(POOLMEM *buf, int32_t size); 58 #define free_memory(x) free_pool_memory(x) 59 extern void free_pool_memory(POOLMEM *buf); 60 61 #endif 62 63 /* Macro to simplify free/reset pointers */ 64 #define free_and_null_pool_memory(a) do{if(a){free_pool_memory(a); (a)=NULL;}} while(0) 65 66 extern void garbage_collect_memory_pool(); 67 extern void close_memory_pool(); 68 extern void print_memory_pool_stats(); 69 70 extern void garbage_collect_memory(); 71 72 73 #define PM_NOPOOL 0 /* nonpooled memory */ 74 #define PM_NAME 1 /* Bacula name */ 75 #define PM_FNAME 2 /* file name buffer */ 76 #define PM_MESSAGE 3 /* daemon message */ 77 #define PM_EMSG 4 /* error message */ 78 #define PM_BSOCK 5 /* BSOCK buffer */ 79 #define PM_MAX PM_BSOCK /* Number of types */ 80 81 class POOL_MEM { 82 char *mem; 83 public: POOL_MEM()84 POOL_MEM() { mem = get_pool_memory(PM_NAME); *mem = 0; } POOL_MEM(int pool)85 POOL_MEM(int pool) { mem = get_pool_memory(pool); *mem = 0; } ~POOL_MEM()86 ~POOL_MEM() { free_pool_memory(mem); mem = NULL; } c_str()87 char *c_str() const { return mem; } addr()88 POOLMEM *&addr() { return mem; } size()89 int size() const { return sizeof_pool_memory(mem); } check_size(int32_t size)90 char *check_size(int32_t size) { 91 mem = check_pool_memory_size(mem, size); 92 return mem; 93 } 94 int32_t max_size(); 95 void realloc_pm(int32_t size); 96 int strcpy(const char *str); 97 int strcat(const char *str); 98 }; 99 100 int pm_strcat(POOLMEM **pm, const char *str); 101 int pm_strcat(POOLMEM *&pm, const char *str); 102 int pm_strcat(POOL_MEM &pm, const char *str); 103 int pm_strcat(POOLMEM *&pm, POOL_MEM &str); 104 int pm_strcat(POOL_MEM &pm, POOL_MEM &str); 105 106 int pm_strcpy(POOLMEM **pm, const char *str); 107 int pm_strcpy(POOLMEM *&pm, const char *str); 108 int pm_strcpy(POOL_MEM &pm, const char *str); 109 int pm_strcpy(POOLMEM *&pm, POOL_MEM &str); 110 111 int pm_memcpy(POOLMEM **pm, const char *data, int32_t n); 112 int pm_memcpy(POOLMEM *&pm, const char *data, int32_t n); 113 int pm_memcpy(POOL_MEM &pm, const char *data, int32_t n); 114 int pm_memcpy(POOLMEM *&pm, POOL_MEM &data, int32_t n); 115 116 #endif 117