source: git/xalloc/omalloc.h @ bebd5a0

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