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 int pm_strcat(POOLMEM **pm, const char *str);
82 int pm_strcat(POOLMEM *&pm, const char *str);
83 int pm_strcat(POOL_MEM &pm, const char *str);
84 int pm_strcat(POOLMEM *&pm, POOL_MEM &str);
85 int pm_strcat(POOL_MEM &pm, POOL_MEM &str);
86 
87 int pm_strcpy(POOLMEM **pm, const char *str);
88 int pm_strcpy(POOLMEM *&pm, const char *str);
89 int pm_strcpy(POOL_MEM &pm, const char *str);
90 int pm_strcpy(POOLMEM *&pm, POOL_MEM &str);
91 
92 int pm_memcpy(POOLMEM **pm, const char *data, int32_t n);
93 int pm_memcpy(POOLMEM *&pm, const char *data, int32_t n);
94 int pm_memcpy(POOL_MEM &pm, const char *data, int32_t n);
95 int pm_memcpy(POOLMEM *&pm, POOL_MEM &data, int32_t n);
96 
97 class POOL_MEM {
98    char *mem;
99 public:
POOL_MEM()100    POOL_MEM() { mem = get_pool_memory(PM_NAME); *mem = 0; }
POOL_MEM(int pool)101    POOL_MEM(int pool) { mem = get_pool_memory(pool); *mem = 0; }
POOL_MEM(POOL_MEM & pm)102    POOL_MEM(POOL_MEM &pm) : mem(get_pool_memory(PM_NAME)) { check_size(pm.size()); memcpy(mem, pm.mem, size()); };
POOL_MEM(const char * str)103    POOL_MEM(const char * str) : mem(get_pool_memory(PM_NAME)) { pm_strcpy(*this, str); };
~POOL_MEM()104    ~POOL_MEM() { free_pool_memory(mem); mem = NULL; }
c_str()105    char *c_str() const { return mem; }
addr()106    POOLMEM *&addr() { return mem; }
handle()107    POOLMEM **handle() { return &mem; }
size()108    int size() const { return sizeof_pool_memory(mem); }
check_size(int32_t size)109    char *check_size(int32_t size) {
110       mem = check_pool_memory_size(mem, size);
111       return mem;
112    }
113    int32_t max_size();
114    void realloc_pm(int32_t size);
115    int strcpy(const char *str);
116    int strcat(const char *str);
117    /* Copy operator with reference and pointers */
118    POOL_MEM &operator=(POOL_MEM &pm) { pm_memcpy(*this, pm.mem, pm.size()); return *this; };
119    POOL_MEM &operator=(POOL_MEM *pm) { pm_memcpy(*this, pm->mem, pm->size()); return *this; };
120 };
121 
122 #endif
123