1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /*                                                                           */
3 /*                  This file is part of the program and library             */
4 /*         SCIP --- Solving Constraint Integer Programs                      */
5 /*                                                                           */
6 /*    Copyright (C) 2002-2021 Konrad-Zuse-Zentrum                            */
7 /*                            fuer Informationstechnik Berlin                */
8 /*                                                                           */
9 /*  SCIP is distributed under the terms of the ZIB Academic License.         */
10 /*                                                                           */
11 /*  You should have received a copy of the ZIB Academic License              */
12 /*  along with SCIP; see the file COPYING. If not visit scipopt.org.         */
13 /*                                                                           */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file   scip_mem.h
17  * @ingroup PUBLICCOREAPI
18  * @brief  public methods for memory management
19  * @author Tobias Achterberg
20  * @author Timo Berthold
21  * @author Thorsten Koch
22  * @author Alexander Martin
23  * @author Marc Pfetsch
24  * @author Kati Wolter
25  * @author Gregor Hendel
26  * @author Leona Gottwald
27  */
28 
29 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
30 
31 #ifndef __SCIP_SCIP_MEM_H__
32 #define __SCIP_SCIP_MEM_H__
33 
34 
35 #include "blockmemshell/memory.h"
36 #include "scip/def.h"
37 #include "scip/type_retcode.h"
38 #include "scip/type_scip.h"
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 /**@addtogroup PublicMemoryMethods
45  *
46  * @{
47  */
48 
49 /* Standard Memory Management Macros */
50 
51 #define SCIPallocMemory(scip,ptr)               ( (BMSallocMemory((ptr)) == NULL) \
52                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
53 #define SCIPallocMemoryArray(scip,ptr,num)      ( (BMSallocMemoryArray((ptr), (num)) == NULL) \
54                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
55 #define SCIPallocClearMemoryArray(scip,ptr,num) ( (BMSallocClearMemoryArray((ptr), (num)) == NULL) \
56                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
57 #define SCIPallocMemorySize(scip,ptr,size)      ( (BMSallocMemorySize((ptr), (size)) == NULL) \
58                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
59 #define SCIPreallocMemoryArray(scip,ptr,newnum) ( (BMSreallocMemoryArray((ptr), (newnum)) == NULL) \
60                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
61 #define SCIPreallocMemorySize(scip,ptr,newsize) ( (BMSreallocMemorySize((ptr), (newsize)) == NULL) \
62                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
63 #define SCIPduplicateMemory(scip, ptr, source)  ( (BMSduplicateMemory((ptr), (source)) == NULL) \
64                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
65 #define SCIPduplicateMemoryArray(scip, ptr, source, num) ( (BMSduplicateMemoryArray((ptr), (source), (num)) == NULL) \
66                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
67 #define SCIPfreeMemory(scip,ptr)                BMSfreeMemory(ptr)
68 #define SCIPfreeMemoryNull(scip,ptr)            BMSfreeMemoryNull(ptr)
69 #define SCIPfreeMemoryArray(scip,ptr)           BMSfreeMemoryArray(ptr)
70 #define SCIPfreeMemoryArrayNull(scip,ptr)       BMSfreeMemoryArrayNull(ptr)
71 #define SCIPfreeMemorySize(scip,ptr)            BMSfreeMemorySize(ptr)
72 #define SCIPfreeMemorySizeNull(scip,ptr)        BMSfreeMemorySizeNull(ptr)
73 
74 /* Block Memory Management Macros
75  *
76  */
77 
78 #define SCIPallocBlockMemory(scip,ptr)          ( (BMSallocBlockMemory(SCIPblkmem(scip), (ptr)) == NULL) \
79                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
80 #define SCIPallocBlockMemoryArray(scip,ptr,num) ( (BMSallocBlockMemoryArray(SCIPblkmem(scip), (ptr), (num)) == NULL) \
81                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
82 #define SCIPallocBlockMemorySize(scip,ptr,size) ( (BMSallocBlockMemorySize(SCIPblkmem(scip), (ptr), (size)) == NULL) \
83                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
84 #define SCIPallocClearBlockMemoryArray(scip,ptr,num) ( (BMSallocClearBlockMemoryArray(SCIPblkmem(scip), (ptr), (num)) == NULL) \
85                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
86 #define SCIPreallocBlockMemoryArray(scip,ptr,oldnum,newnum) ( (BMSreallocBlockMemoryArray(SCIPblkmem(scip), (ptr), (oldnum), (newnum)) == NULL) \
87                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
88 #define SCIPreallocBlockMemorySize(scip,ptr,oldsize,newsize) ( (BMSreallocBlockMemorySize(SCIPblkmem(scip), (ptr), (oldsize), (newsize)) == NULL) \
89                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
90 #define SCIPduplicateBlockMemory(scip, ptr, source) ( (BMSduplicateBlockMemory(SCIPblkmem(scip), (ptr), (source)) == NULL) \
91                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
92 #define SCIPduplicateBlockMemoryArray(scip, ptr, source, num) ( (BMSduplicateBlockMemoryArray(SCIPblkmem(scip), (ptr), (source), (num)) == NULL) \
93                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
94 #define SCIPensureBlockMemoryArray(scip,ptr,arraysizeptr,minsize) ( (SCIPensureBlockMemoryArray_call((scip), (void**)(ptr), sizeof(**(ptr)), (arraysizeptr), (minsize))) )
95 #define SCIPfreeBlockMemory(scip,ptr)           BMSfreeBlockMemory(SCIPblkmem(scip), (ptr))
96 #define SCIPfreeBlockMemoryNull(scip,ptr)       BMSfreeBlockMemoryNull(SCIPblkmem(scip), (ptr))
97 #define SCIPfreeBlockMemoryArray(scip,ptr,num)  BMSfreeBlockMemoryArray(SCIPblkmem(scip), (ptr), (num))
98 #define SCIPfreeBlockMemoryArrayNull(scip,ptr,num) BMSfreeBlockMemoryArrayNull(SCIPblkmem(scip), (ptr), (num))
99 #define SCIPfreeBlockMemorySize(scip,ptr,size)  BMSfreeBlockMemorySize(SCIPblkmem(scip), (ptr), (size))
100 #define SCIPfreeBlockMemorySizeNull(scip,ptr,size) BMSfreeBlockMemorySizeNull(SCIPblkmem(scip), (ptr), (size))
101 
102 
103 /* Buffer Memory Management Macros
104  *
105  *
106  */
107 
108 
109 #define SCIPallocBuffer(scip,ptr)               ( (BMSallocBufferMemory(SCIPbuffer(scip), (ptr)) == NULL) \
110                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
111 #define SCIPallocBufferArray(scip,ptr,num)      ( (BMSallocBufferMemoryArray(SCIPbuffer(scip), (ptr), (num)) == NULL) \
112                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
113 #define SCIPallocClearBufferArray(scip,ptr,num) ( (BMSallocClearBufferMemoryArray(SCIPbuffer(scip), (ptr), (num)) == NULL) \
114                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
115 #define SCIPreallocBufferArray(scip,ptr,num)    ( (BMSreallocBufferMemoryArray(SCIPbuffer(scip), (ptr), (num)) == NULL) \
116                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
117 #define SCIPduplicateBuffer(scip,ptr,source)    ( (BMSduplicateBufferMemory(SCIPbuffer(scip), (ptr), (source), (size_t)sizeof(**(ptr))) \
118                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
119 #define SCIPduplicateBufferArray(scip,ptr,source,num) ( (BMSduplicateBufferMemoryArray(SCIPbuffer(scip), (ptr), (source), (num)) == NULL) \
120                                                        ? SCIP_NOMEMORY : SCIP_OKAY )
121 #define SCIPfreeBuffer(scip,ptr)                BMSfreeBufferMemorySize(SCIPbuffer(scip), (ptr))
122 #define SCIPfreeBufferNull(scip,ptr)            BMSfreeBufferMemoryNull(SCIPbuffer(scip), (ptr))
123 #define SCIPfreeBufferArray(scip,ptr)           BMSfreeBufferMemoryArray(SCIPbuffer(scip), (ptr))
124 #define SCIPfreeBufferArrayNull(scip,ptr)       BMSfreeBufferMemoryArrayNull(SCIPbuffer(scip), (ptr))
125 
126 
127 #define SCIPallocCleanBuffer(scip,ptr)          ( (BMSallocBufferMemory(SCIPcleanbuffer(scip), (ptr)) == NULL) \
128                                                   ? SCIP_NOMEMORY : SCIP_OKAY )
129 #define SCIPallocCleanBufferArray(scip,ptr,num) ( (BMSallocBufferMemoryArray(SCIPcleanbuffer(scip), (ptr), (num)) == NULL) \
130                                                   ? SCIP_NOMEMORY : SCIP_OKAY )
131 #define SCIPfreeCleanBuffer(scip,ptr)           BMSfreeBufferMemorySize(SCIPcleanbuffer(scip), (ptr))
132 #define SCIPfreeCleanBufferNull(scip,ptr)       BMSfreeBufferMemoryNull(SCIPcleanbuffer(scip), (ptr))
133 #define SCIPfreeCleanBufferArray(scip,ptr)      BMSfreeBufferMemoryArray(SCIPcleanbuffer(scip), (ptr))
134 #define SCIPfreeCleanBufferArrayNull(scip,ptr)  BMSfreeBufferMemoryArrayNull(SCIPcleanbuffer(scip), (ptr))
135 
136 
137 /* Memory Management Functions
138  *
139  *
140  */
141 
142 /** returns block memory to use at the current time
143  *
144  *  @return the block memory to use at the current time.
145  */
146 SCIP_EXPORT
147 BMS_BLKMEM* SCIPblkmem(
148    SCIP*                 scip                /**< SCIP data structure */
149    );
150 
151 /** returns buffer memory for short living temporary objects
152  *
153  *  @return the buffer memory for short living temporary objects
154  */
155 SCIP_EXPORT
156 BMS_BUFMEM* SCIPbuffer(
157    SCIP*                 scip                /**< SCIP data structure */
158    );
159 
160 /** returns clean buffer memory for short living temporary objects initialized to all zero
161  *
162  *  @return the buffer memory for short living temporary objects initialized to all zero
163  */
164 SCIP_EXPORT
165 BMS_BUFMEM* SCIPcleanbuffer(
166    SCIP*                 scip                /**< SCIP data structure */
167    );
168 
169 /** returns the total number of bytes used in block and buffer memory
170  *
171  *  @return the total number of bytes used in block and buffer memory.
172  */
173 SCIP_EXPORT
174 SCIP_Longint SCIPgetMemUsed(
175    SCIP*                 scip                /**< SCIP data structure */
176    );
177 
178 /** returns the total number of bytes in block and buffer memory
179  *
180  *  @return the total number of bytes in block and buffer memory.
181  */
182 SCIP_EXPORT
183 SCIP_Longint SCIPgetMemTotal(
184    SCIP*                 scip                /**< SCIP data structure */
185    );
186 
187 /** returns the estimated number of bytes used by external software, e.g., the LP solver
188  *
189  *  @return the estimated number of bytes used by external software, e.g., the LP solver.
190  */
191 SCIP_EXPORT
192 SCIP_Longint SCIPgetMemExternEstim(
193    SCIP*                 scip                /**< SCIP data structure */
194    );
195 
196 /** calculate memory size for dynamically allocated arrays
197  *
198  *  @return the memory size for dynamically allocated arrays.
199  */
200 SCIP_EXPORT
201 int SCIPcalcMemGrowSize(
202    SCIP*                 scip,               /**< SCIP data structure */
203    int                   num                 /**< minimum number of entries to store */
204    );
205 
206 /** extends a dynamically allocated block memory array to be able to store at least the given number of elements;
207  *  use SCIPensureBlockMemoryArray() define to call this method!
208  *
209  *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
210  *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
211  */
212 SCIP_EXPORT
213 SCIP_RETCODE SCIPensureBlockMemoryArray_call(
214    SCIP*                 scip,               /**< SCIP data structure */
215    void**                arrayptr,           /**< pointer to dynamically sized array */
216    size_t                elemsize,           /**< size in bytes of each element in array */
217    int*                  arraysize,          /**< pointer to current array size */
218    int                   minsize             /**< required minimal array size */
219    );
220 
221 /** prints output about used memory */
222 SCIP_EXPORT
223 void SCIPprintMemoryDiagnostic(
224    SCIP*                 scip                /**< SCIP data structure */
225    );
226 
227 /** @} */
228 
229 #ifdef __cplusplus
230 }
231 #endif
232 
233 #endif
234