1 | #ifndef XMEMORY_H |
---|
2 | #define XMEMORY_H |
---|
3 | /**************************************** |
---|
4 | * Computer Algebra System SINGULAR * |
---|
5 | ****************************************/ |
---|
6 | /* |
---|
7 | * ABSTRACT: omalloc simulation |
---|
8 | */ |
---|
9 | /* debug routines of omalloc are not implemented, but as dummies provided: */ |
---|
10 | #define OM_NDEBUG 1 |
---|
11 | |
---|
12 | #include <stdlib.h> |
---|
13 | #include <string.h> |
---|
14 | #ifdef __cplusplus |
---|
15 | extern "C" { |
---|
16 | #endif |
---|
17 | |
---|
18 | typedef size_t omBin; |
---|
19 | |
---|
20 | struct omInfo_s; |
---|
21 | typedef struct omInfo_s omInfo_t; |
---|
22 | struct omInfo_s |
---|
23 | { |
---|
24 | long MaxBytesSystem; /* set in omUpdateInfo(), is more accurate with malloc support */ |
---|
25 | long CurrentBytesSystem; /* set in omUpdateInfo(), is more accurate with malloc support */ |
---|
26 | long MaxBytesSbrk; /* always up-to-date, not very accurate, needs omInintInfo() */ |
---|
27 | long CurrentBytesSbrk; /* set in omUpdateInfo(), needs omInintInfo() */ |
---|
28 | long MaxBytesMmap; /* set in omUpdateInfo(), not very accurate */ |
---|
29 | long CurrentBytesMmap; /* set in omUpdateInfo(), not very accurate */ |
---|
30 | long UsedBytes; /* set in omUpdateInfo() */ |
---|
31 | long AvailBytes; /* set in omUpdateInfo() */ |
---|
32 | long UsedBytesMalloc; /* set in omUpdateInfo(), needs malloc support */ |
---|
33 | long AvailBytesMalloc; /* set in omUpdateInfo(), needs malloc support */ |
---|
34 | long MaxBytesFromMalloc; /* always kept up-to-date */ |
---|
35 | long CurrentBytesFromMalloc; /* always kept up-to-date */ |
---|
36 | long MaxBytesFromValloc; /* always kept up-to-date */ |
---|
37 | long CurrentBytesFromValloc; /* always kept up-to-date */ |
---|
38 | long UsedBytesFromValloc; /* set in omUpdateInfo() */ |
---|
39 | long AvailBytesFromValloc;/* set in omUpdateInfo() */ |
---|
40 | long MaxPages; /* always kept up-to-date */ |
---|
41 | long UsedPages; /* always kept up-to-date */ |
---|
42 | long AvailPages; /* always kept up-to-date */ |
---|
43 | long MaxRegionsAlloc; /* always kept up-to-date */ |
---|
44 | long CurrentRegionsAlloc; /* always kept up-to-date */ |
---|
45 | }; |
---|
46 | |
---|
47 | extern struct omInfo_s om_Info; |
---|
48 | |
---|
49 | struct omOpts_s; |
---|
50 | extern struct omOpts_s |
---|
51 | { |
---|
52 | int MinTrack; |
---|
53 | int MinCheck; |
---|
54 | int MaxTrack; |
---|
55 | int MaxCheck; |
---|
56 | int Keep; |
---|
57 | int HowToReportErrors; |
---|
58 | int MarkAsStatic; |
---|
59 | unsigned int PagesPerRegion; |
---|
60 | void (*OutOfMemoryFunc)(); |
---|
61 | void (*MemoryLowFunc)(); |
---|
62 | void (*ErrorHook)(); |
---|
63 | } om_Opts; |
---|
64 | |
---|
65 | typedef struct omOpts_s omOpts_t; |
---|
66 | |
---|
67 | extern int om_sing_opt_show_mem; |
---|
68 | |
---|
69 | static inline void * omalloc(size_t s) |
---|
70 | { if (s!=0) {long *d=(long*)malloc(s+sizeof(long)); *d=s;d++;return d; } |
---|
71 | else return NULL; |
---|
72 | } |
---|
73 | static inline void * omAlloc(size_t s) |
---|
74 | { long *d=(long*)malloc(s+sizeof(long)); *d=s;d++;return d; } |
---|
75 | static inline void * omAlloc0(size_t s) |
---|
76 | { void *d=omAlloc(s);memset(d,0,s); return d; } |
---|
77 | static inline void * omalloc0(size_t s) |
---|
78 | { if (s!=0) { void *d=omAlloc(s);memset(d,0,s); return d;} else return NULL; } |
---|
79 | |
---|
80 | static inline void *omRealloc(void *d, size_t ns) |
---|
81 | { if (d==NULL) return omAlloc(ns); |
---|
82 | else |
---|
83 | { |
---|
84 | long *dd=(long*)d; dd--; dd=(long*)realloc(dd,ns+sizeof(long)); |
---|
85 | *dd=ns+sizeof(long);dd++; return dd; |
---|
86 | } |
---|
87 | } |
---|
88 | #define omReallocAligned(A,B) omRealloc(A,B) |
---|
89 | static inline void *omReallocSize(void *d, size_t os, size_t ns) |
---|
90 | { if (d==NULL) return omAlloc(ns); |
---|
91 | else |
---|
92 | { |
---|
93 | long *dd=(long*)d; dd--; dd=(long*)realloc(dd,ns+sizeof(long)); |
---|
94 | *dd=ns+sizeof(long);dd++; return dd; |
---|
95 | } |
---|
96 | } |
---|
97 | static inline long omSizeOfAddr(void *d) |
---|
98 | { long *dd=(long*)d; dd--; return *dd;} |
---|
99 | |
---|
100 | static inline void omFree(void *d) |
---|
101 | { if (d!=NULL) { long *dd=(long*)d; dd--; free(dd);}} |
---|
102 | |
---|
103 | static inline void *omRealloc0(void *d, size_t ns) |
---|
104 | { |
---|
105 | void *n=omAlloc0(ns); |
---|
106 | if (d!=NULL) |
---|
107 | { |
---|
108 | size_t c; |
---|
109 | size_t os=omSizeOfAddr(d); |
---|
110 | if (ns>os) c=os; else c=ns; |
---|
111 | memcpy(n,d,c); |
---|
112 | omFree(d); |
---|
113 | } |
---|
114 | return n; |
---|
115 | } |
---|
116 | static inline void omFreeSize(void *d, size_t s) |
---|
117 | { if (d!=NULL) { long *dd=(long*)d; dd--; free(dd);}} |
---|
118 | |
---|
119 | static inline char * omStrDup(const char *s) |
---|
120 | { size_t l=strlen(s);char *ns=(char *)omAlloc(l+1); |
---|
121 | return strcpy(ns,s); |
---|
122 | } |
---|
123 | static inline void * omMemDup(void * s) |
---|
124 | { long *n;long *d=(long*)s; d--; |
---|
125 | n=(long*)malloc(*d+sizeof(long)); |
---|
126 | memcpy(n,d,(*d)+sizeof(long)); |
---|
127 | n++; |
---|
128 | return n; |
---|
129 | } |
---|
130 | |
---|
131 | /* #define omSizeWOfBin(bin_ptr) ((bin_ptr)->sizeW) */ |
---|
132 | #define omSizeWOfBin(bin_ptr) (((bin_ptr)+sizeof(long)-1)/sizeof(long)) |
---|
133 | |
---|
134 | /******************************************************************* |
---|
135 | * |
---|
136 | * error codes |
---|
137 | * |
---|
138 | *******************************************************************/ |
---|
139 | enum omError_e |
---|
140 | { |
---|
141 | omError_NoError = 0, |
---|
142 | omError_Unknown, |
---|
143 | omError_InternalBug, |
---|
144 | omError_MemoryCorrupted, |
---|
145 | omError_NullAddr, |
---|
146 | omError_InvalidRangeAddr, |
---|
147 | omError_FalseAddr, |
---|
148 | omError_FalseAddrOrMemoryCorrupted, |
---|
149 | omError_WrongSize, |
---|
150 | omError_FreedAddr, |
---|
151 | omError_FreedAddrOrMemoryCorrupted, |
---|
152 | omError_WrongBin, |
---|
153 | omError_UnknownBin, |
---|
154 | omError_NotBinAddr, |
---|
155 | omError_UnalignedAddr, |
---|
156 | omError_NullSizeAlloc, |
---|
157 | omError_ListCycleError, |
---|
158 | omError_SortedListError, |
---|
159 | omError_KeptAddrListCorrupted, |
---|
160 | omError_FreePattern, |
---|
161 | omError_BackPattern, |
---|
162 | omError_FrontPattern, |
---|
163 | omError_NotString, |
---|
164 | omError_StickyBin, |
---|
165 | omError_MaxError |
---|
166 | }; |
---|
167 | // typedef enum omError_e omError_t; |
---|
168 | |
---|
169 | #define omSizeWOfAddr(P) (omSizeOfAddr(P)/sizeof(long)) |
---|
170 | |
---|
171 | #define omTypeAllocBin(T,P,B) P=(T)omAlloc(B) |
---|
172 | #define omTypeAlloc(T,P,S) P=(T)omAlloc(S) |
---|
173 | #define omTypeAlloc0Bin(T,P,B) P=(T)omAlloc0(B) |
---|
174 | #define omAlloc0Aligned(S) omAlloc0(S) |
---|
175 | #define omAllocAligned(S) omAlloc(S) |
---|
176 | #define omAllocBin(B) omAlloc(B) |
---|
177 | #define omAllocBin0(B) omAlloc0(B) |
---|
178 | #define omAlloc0Bin(B) omAlloc0(B) |
---|
179 | #define omInitInfo() |
---|
180 | #define omInitGetBackTrace() |
---|
181 | #define omUpdateInfo() |
---|
182 | #define omPrintStats(F) |
---|
183 | #define omPrintInfo(F) |
---|
184 | #define omPrintBinStats(F) |
---|
185 | #define omMarkMemoryAsStatic() |
---|
186 | #define omfree(P) omFree(P) |
---|
187 | #define omFree(P) omFree(P) |
---|
188 | #define omFreeBin(P,B) omFree(P) |
---|
189 | #define omfreeSize(P,S) omFreeSize(P,S) |
---|
190 | #define omFreeFunc omFree |
---|
191 | #define omFreeBinAddr(P) omFree(P) |
---|
192 | #define omrealloc(A,NS) omRealloc(A,NS) |
---|
193 | #define omreallocSize(A,OS,NS) omRealloc(A,NS) |
---|
194 | #define omRealloc0Size(A,OS,NS) omRealloc0(A,NS) |
---|
195 | #define omrealloc0Size(A,OS,NS) omRealloc(A,NS) |
---|
196 | #define omMarkAsStaticAddr(A) |
---|
197 | #define omMemCpyW(A,B,S) memcpy(A,B,(S)<<2) |
---|
198 | #define omMemcpyW(A,B,S) memcpy(A,B,(S)<<2) |
---|
199 | #define omGetSpecBin(A) (A) |
---|
200 | #define omUnGetSpecBin(A) do {} while (0) |
---|
201 | #define memcpyW(A,B,C) memcpy(A,B,(C)*sizeof(long)) |
---|
202 | #define omGetStickyBinOfBin(B) omGetSpecBin(B) |
---|
203 | |
---|
204 | |
---|
205 | /* debug dummies: */ |
---|
206 | #define omTypeReallocAlignedSize omTypeReallocSize |
---|
207 | #define omTypeRealloc0AlignedSize omTypeRealloc0Size |
---|
208 | #define omReallocAlignedSize omReallocSize |
---|
209 | #define omRealloc0AlignedSize omRealloc0Size |
---|
210 | #define omMemDupAligned omMemDup |
---|
211 | #define omCheckIf(cond, test) do {} while (0) |
---|
212 | #define omCheckBinAddr(addr) do {} while (0) |
---|
213 | #define omCheckAddrBin(addr,bin) do {} while (0) |
---|
214 | #define omCheckBinAddrSize(addr,size) do {} while (0) |
---|
215 | #define omCheckAddrSize(addr,size) do {} while (0) |
---|
216 | #define omCheckAddr(addr) do {} while (0) |
---|
217 | #define omcheckAddrSize(addr,size) do {} while (0) |
---|
218 | #define omcheckAddr(addr) do {} while (0) |
---|
219 | #define omCheckBin(bin) do {} while (0) |
---|
220 | #define omCheckMemory() do {} while (0) |
---|
221 | #define omPrintCurrentBackTraceMax(A,B) do {} while (0) |
---|
222 | #define omPrintUsedTrackAddrs(F,max) do {} while (0) |
---|
223 | #define omPrintCurrentBackTrace(F) do {} while (0) |
---|
224 | #define omPrintUsedAddrs(F,max) do {} while (0) |
---|
225 | #define omdebugAddrSize(A,B) do {} while (0) |
---|
226 | #define omPrintAddrInfo(A,B,C) do {} while (0) |
---|
227 | #define omIsBinPageAddr(A) (1) |
---|
228 | #define omTestBinAddrSize(A,B,C) (omError_NoError) |
---|
229 | #define omTestList(ptr, level) (omError_NoError) |
---|
230 | #define omInitRet_2_Info(argv0) do {} while (0) |
---|
231 | #define omMergeStickyBinIntoBin(A,B) do {} while (0) |
---|
232 | |
---|
233 | |
---|
234 | #ifdef __cplusplus |
---|
235 | } |
---|
236 | #endif |
---|
237 | |
---|
238 | #undef OMALLOC_USES_MALLOC |
---|
239 | #define X_OMALLOC |
---|
240 | #define omMallocFunc omAlloc |
---|
241 | #define omReallocSizeFunc omReallocSize |
---|
242 | #define omFreeSizeFunc omFreeSize |
---|
243 | /* #define OM_NDEBUG */ |
---|
244 | #undef OM_SING_KEEP |
---|
245 | |
---|
246 | #endif |
---|