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