1 /*******************************************************************
2  *  File:    omDefaultConfig.h
3  *  Purpose: default declaration of of configurable stuff
4  *  Author:  obachman (Olaf Bachmann)
5  *  Created: 11/99
6  *******************************************************************/
7 
8 /********************************************************************
9   If you want to make changes to any of these defines, create a file,
10   say, MyOmConfig.h, define your particular stuff there, and run configure with
11   --external-config-h=MyOmConfig.h.
12 
13   If you also need to implement something, then implement it in, say,
14   MyOmConfig.c, and run configure with
15   --external-config-h=MyOmConfig.h --external-config-c=MyOmConfig.c
16 
17   For omTest to link, you need to make sure that your implementation can also be
18   used when not linked with your application. I.e. you should also provide a
19   stand-alone implementation if OM_STANDALONE is defined.
20 
21   Notice that some of these parameters can also be set at run-time, using
22   the global om_Opts struct.
23 ********************************************************************/
24 #include <limits.h>
25 #include "omConfig.h"
26 /* if external config was provided, 'make' makes links from it to omExternalConfig.h */
27 #ifdef OM_HAVE_EXTERNAL_CONFIG_H
28 #include "omExternalConfig.h"
29 #endif
30 
31 /* If this is larger than the track parameter given to the omDebug routines,
32    then this is used as TrackLevel: om_Opts.MinTrack is initalized with this */
33 #ifndef OM_DEFAULT_MIN_TRACK
34 #define OM_DEFAULT_MIN_TRACK 0
35 #endif
36 
37 /* If this is larger than the check parameter given to the omDebug routines,
38    then this is used as CheckLevel: om_Opts.MinCheck is initalized with this */
39 #ifndef OM_DEFAULT_MIN_CHECK
40 #define OM_DEFAULT_MIN_CHECK 0
41 #endif
42 
43 /* MAX options. If Max < Min, then Max value is used. */
44 /* If this is smaller than the track parameter given to the omDebug routines,
45    then this is used as TrackLevel: om_Opts.MaxTrack is initalized with this */
46 #ifndef OM_DEFAULT_MAX_TRACK
47 #define OM_DEFAULT_MAX_TRACK 5
48 #endif
49 
50 /* If this is smaller than the check parameter given to the omDebug routines,
51    then this is used as CheckLevel: om_Opts.MaxCheck is initalized with this */
52 #ifndef OM_DEFAULT_MAX_CHECK
53 #define OM_DEFAULT_MAX_CHECK 10
54 #endif
55 
56 /* If this is greater than 0, then the omDebugFree omDebugRealloc delay freeing memory
57    by that many blocks: Initalizes omOpts.Keep
58    Setting this to LONG_MAX never frees memory */
59 #ifndef OM_DEFAULT_KEEP
60 #define OM_DEFAULT_KEEP 100
61 #endif
62 
63 /* If this is set to
64    0: errors are not reported, only the global variable om_ErrorStatus is set
65    1: short error description, i.e. omError2String(om_ErrorStatus), is reported to stderr
66    2: backtrace of current stack is printed to stderr
67    3: more detailed error description is printed -- this might not make too much sense if
68       you are not familiar with omalloc
69    Initializes om_Opts.HowToReprotErrors
70 */
71 #ifndef OM_DEFAULT_HOW_TO_REPORT_ERRORS
72 #if defined(OM_INTERNAL_DEBUG)
73 #define OM_DEFAULT_HOW_TO_REPORT_ERRORS 3
74 #else
75 #define OM_DEFAULT_HOW_TO_REPORT_ERRORS 2
76 #endif
77 #endif
78 
79 /* if this is set, then all memory allocated with track >= 1 is marked as
80    static, i.e. it is not mention in omPrintUsedAddrs */
81 #ifndef OM_DEFAULT_MARK_AS_STATIC
82 #define OM_DEFAULT_MARK_AS_STATIC 0
83 #endif
84 
85 /* Number of pages per region, i.e., how many pages are allocated at once, after we
86    run out of pages: Initalizes om_Opts.PagesPerRegion
87    The higher this value is, the fewer calls to valloc (resp. mmap) need to be make,
88    but the more unused memory the application might have allocated from the operating system
89 */
90 #ifndef OM_DEFAULT_PAGES_PER_REGION
91 #define OM_DEFAULT_PAGES_PER_REGION 512
92 #endif
93 
94 /* This is called if nothing goes any more, i.e., if
95    memory request can not be serviced. If set, this function should never return.*/
96 #ifndef OM_DEFAULT_OUT_OF_MEMORY_FUNC
97 /* This initializes om_Opts.OutOfMemoryFunc which is declared as
98    void (*OutOfMemoryFunc)(); */
99 #define OM_DEFAULT_OUT_OF_MEMORY_FUNC NULL
100 #endif
101 #ifndef OM_OUT_OF_MEMORY_HOOK
102 #define OM_OUT_OF_MEMORY_HOOK()                             \
103 do                                                          \
104 {                                                           \
105   if (om_Opts.OutOfMemoryFunc != NULL)                      \
106     om_Opts.OutOfMemoryFunc();                              \
107    fprintf(stderr, "***Emergency Exit: Out of Memory\n");   \
108    exit(1);                                                 \
109 }                                                           \
110 while (0)
111 #endif
112 
113 /* This is called whenever no more memory could be obtained from the system.
114    It should trigger the release of as much memory by the application as possible */
115 #ifndef OM_DEFAULT_MEMORY_LOW_FUNC
116 /* This initializes om_Opts.MemoryLowFunc which is declared as
117    void (*MemoryLowFunc)(); */
118 #define OM_DEFAULT_MEMORY_LOW_FUNC NULL
119 #endif
120 #ifndef OM_DEFAULT_MEMORY_LOW_HOOK
121 #define OM_MEMORY_LOW_HOOK()                    \
122 do                                              \
123 {                                               \
124   if (om_Opts.MemoryLowFunc != NULL)            \
125     om_Opts.MemoryLowFunc();                    \
126 }                                               \
127 while(0)
128 #endif
129 
130 /* This is called after an omError was reported.
131    It is especially useful to set a debugger breakpoint
132    to this func */
133 #ifndef OM_DEFAULT_ERROR_HOOK
134 #define OM_DEFAULT_ERROR_HOOK omErrorBreak
135 #endif
136 
137 /*******************************************************************
138  *  File:    omSingularConfig.h
139  *  Purpose: declaration of External Config stuff for omalloc
140  *           This file is part of omDefaultConfig.h, i.e., at the the time
141  *           the omalloc library is built. Any changes to the default config
142  *           of omalloc should be done here (and, of course, you need to
143  *           rebuilt the library).
144  *  Author:  obachman@mathematik.uni-kl.de (Olaf Bachmann)
145  *  Created: 8/00
146  *******************************************************************/
147 #ifdef __cplusplus
148 extern "C"
149 {
150 #endif
151 
152 #include <stdlib.h>
153 #include <stdio.h>
154 
155 
156 #ifdef OM_ALLOC_SYSTEM_C
157 int om_sing_opt_show_mem = 0;
158 size_t om_sing_last_reported_size = 0;
159 #else
160 extern int om_sing_opt_show_mem;
161 extern size_t om_sing_last_reported_size;
162 #endif
163 
164 /* number of bytes for difference to report: every 1 MByte */
165 #define SING_REPORT_THRESHOLD 1000*1024
166 #define OM_SINGULAR_HOOK                                                        \
167 do                                                                            \
168 {                                                                             \
169   if (om_sing_opt_show_mem)                                                   \
170   {                                                                           \
171     size_t _current_bytes = om_Info.CurrentBytesFromMalloc +                  \
172                             (om_Info.UsedPages << LOG_BIT_SIZEOF_SYSTEM_PAGE);\
173     size_t _diff = (_current_bytes > om_sing_last_reported_size ?             \
174                    _current_bytes - om_sing_last_reported_size :              \
175                    om_sing_last_reported_size - _current_bytes);              \
176     if (_diff >= SING_REPORT_THRESHOLD)                                       \
177     {                                                                         \
178       fprintf(stdout, "[%ldk]", (long)(_current_bytes + 1023)/1024);                \
179       fflush(stdout);                                                         \
180       om_sing_last_reported_size = _current_bytes;                            \
181     }                                                                         \
182   }                                                                           \
183 }                                                                             \
184 while (0)
185 
186 #ifdef __cplusplus
187 }
188 #endif
189 
190 /********************************************************************
191  *
192  * The following can NOT be set at run time
193  *
194  ********************************************************************/
195 /* The following hooks are called after the respective
196    system routine was called, and the Stats struct was updated
197    Not settable at run-time (makes no sense for these to be functions, for they would
198    be called each time the underlying malloc/valloc is called !) */
199 #ifndef OM_REALLOC_HOOK
200 #define OM_REALLOC_HOOK(oldsize, newsize) do {} while (0)
201 #endif
202 #ifndef OM_VALLOC_HOOK
203 #define OM_VALLOC_HOOK(size) do {} while (0)
204 #endif
205 #ifndef OM_VFREE_HOOK
206 #define OM_VFREE_HOOK(size) do {} while (0)
207 #endif
208 #define OM_MALLOC_HOOK(size)                OM_SINGULAR_HOOK
209 #define OM_FREE_HOOK(size)                  OM_SINGULAR_HOOK
210 #define OM_ALLOC_BINPAGE_HOOK               OM_SINGULAR_HOOK
211 #define OM_FREE_BINPAGE_HOOK                OM_SINGULAR_HOOK
212 
213 /*
214  * Some stuff related to tracking of addresses
215  */
216 
217 /* minimal number of WORDS for padding before addr: needs to > 0: only relevant for track >= 3 */
218 #ifndef OM_MIN_SIZEWOF_FRONT_PATTERN
219 #define OM_MIN_SIZEWOF_FRONT_PATTERN 1
220 #endif
221 
222 /* minimal number of WORDS for padding before addr: needs to > 0: only relevant for track >= 3 */
223 #ifndef OM_MIN_SIZEWOF_BACK_PATTERN
224 #define OM_MIN_SIZEWOF_BACK_PATTERN 1
225 #endif
226 
227 /* maximal number of stack frames kept for stack at the allocation time of addr (track >= 2)
228    and free time of addr (track >= 5) */
229 #ifndef OM_MAX_KEPT_FRAMES
230 #define OM_MAX_KEPT_FRAMES 10
231 #endif
232 
233 /* pattern with which memory is initialized, for front and back padding,
234    and for free memory: only relevant if track >= 3*/
235 #ifndef OM_INIT_PATTERN
236 #define OM_INIT_PATTERN    0xfe
237 #endif
238 #ifndef OM_FRONT_PATTERN
239 #define OM_FRONT_PATTERN   0xfd
240 #endif
241 #ifndef OM_BACK_PATTERN
242 #define OM_BACK_PATTERN    0xfc
243 #endif
244 #ifndef OM_FREE_PATTERN
245 #define OM_FREE_PATTERN    0xfb
246 #endif
247