Linux makefiles
[canaan.git] / prj / tech / libsrc / lgalloc / primallc.cpp
blobd28036389d60dc3895ebc1ec279dca410f1f3ff9
1 ///////////////////////////////////////////////////////////////////////////////
2 // $Source: x:/prj/tech/libsrc/lgalloc/RCS/primallc.cpp $
3 // $Author: TOML $
4 // $Date: 1998/06/10 13:58:15 $
5 // $Revision: 1.7 $
6 //
8 #ifdef _WIN32
10 #include <lg.h>
11 #undef Free
12 #undef Malloc
13 #undef Realloc
15 #include <memcore.h>
16 #include <primallc.h>
18 #pragma code_seg("lgalloc")
20 ///////////////////////////////////////////////////////////////////////////////
22 volatile cFastMutex g_AllocMutex;
24 ///////////////////////////////////////////////////////////////////////////////
26 // CLASS: cPrimaryMalloc, members
29 cPrimaryMalloc::cPrimaryMalloc()
31 initAllocCap = 0x2000000;
32 allocCap = 0x2000000;
33 totalAlloc = 0;
34 #ifndef SHIP
35 peakAlloc = 0;
36 #endif
39 ///////////////////////////////////////
41 cPrimaryMalloc::~cPrimaryMalloc()
46 ///////////////////////////////////////
48 ulong LGAPI cPrimaryMalloc::DefPageFunc(ulong needed, sAllocLimits * pLimits)
50 return 0;
53 ///////////////////////////////////////
55 STDMETHODIMP_(void *) cPrimaryMalloc::Alloc(ULONG size)
57 // @Note (toml 07-14-97): This code is block copied in AllocEx and should be kept in sync
58 if (!size)
59 size = 1; // For VC compatibility, allow 0 sized allocations.
61 IAllocator * const pNext = m_pNext;
62 void * p;
63 BOOL fMoreToPage = FALSE;
65 // Until we actually allocate a block...
68 // Page memory if over limit
69 if (totalAlloc > allocCap)
70 fMoreToPage = ((*m_pfnPage)(size, this) != 0);
72 // Allocate our block
73 AllocThreadLock();
74 p = pNext->Alloc(size);
75 if (p)
77 totalAlloc += pNext->GetSize(p);
78 #ifndef SHIP
79 if (totalAlloc > peakAlloc)
80 peakAlloc = totalAlloc;
81 #endif
82 AllocThreadUnlock();
83 return p;
85 AllocThreadUnlock();
87 } while (fMoreToPage);
89 g_fQuietAssert = FALSE;
90 CriticalMsg("Out of memory");
92 return NULL;
95 ///////////////////////////////////////
97 STDMETHODIMP_(void *) cPrimaryMalloc::Realloc(void * pOld, ULONG newClientSize)
99 // @Note (toml 07-14-97): This code is block copied in ReallocEx and should be kept in sync
101 // Let's handle ANSI behaviors here...
102 if (!pOld)
103 return cPrimaryMalloc::Alloc(newClientSize);
105 if (!newClientSize)
107 cPrimaryMalloc::Free(pOld);
108 return 0;
111 AllocThreadLock();
113 void * pNew;
114 const int oldClientSize = m_pNext->GetSize(pOld);
115 BOOL fMoreToPage = FALSE;
116 const int difference = newClientSize - oldClientSize;
120 if (difference > 0 && m_pfnPage && totalAlloc > allocCap)
122 AllocThreadUnlock();
123 fMoreToPage = ((*m_pfnPage)(difference, this) != 0);
124 AllocThreadLock();
127 pNew = m_pNext->Realloc(pOld, newClientSize);
129 } while (!pNew && fMoreToPage);
131 if (pNew)
133 totalAlloc += m_pNext->GetSize(pNew) - oldClientSize;
134 #ifndef SHIP
135 if (totalAlloc > peakAlloc)
136 peakAlloc = totalAlloc;
137 #endif
139 else
141 g_fQuietAssert = FALSE;
142 CriticalMsg("Out of memory");
145 AllocThreadUnlock();
147 return pNew;
150 ///////////////////////////////////////
152 STDMETHODIMP_(void) cPrimaryMalloc::Free(void * p)
154 // @Note (toml 07-14-97): This code is block copied in FreeEx and should be kept in sync
155 if (!p)
156 return;
158 AllocThreadLock();
159 IAllocator * const pNext = m_pNext;
160 totalAlloc -= pNext->GetSize(p);
161 pNext->Free(p);
162 AllocThreadUnlock();
165 ///////////////////////////////////////
167 STDMETHODIMP_(ULONG) cPrimaryMalloc::GetSize(void * p)
169 ulong result;
171 if (!p)
172 return 0;
174 AllocThreadLock();
175 result = m_pNext->GetSize(p);
176 AllocThreadUnlock();
178 return result;
181 ///////////////////////////////////////
183 STDMETHODIMP_(int) cPrimaryMalloc::DidAlloc(void * pv)
185 int result;
187 AllocThreadLock();
188 result = m_pNext->DidAlloc(pv);
189 AllocThreadUnlock();
191 return result;
194 ///////////////////////////////////////
196 STDMETHODIMP_(void) cPrimaryMalloc::HeapMinimize()
198 AllocThreadLock();
199 m_pNext->HeapMinimize();
200 AllocThreadUnlock();
203 ///////////////////////////////////////
204 #ifndef SHIP
206 STDMETHODIMP_(void *) cPrimaryMalloc::AllocEx(ULONG size, const char * pszFile, int line)
208 // @Note (toml 07-14-97): This code is block copied FROM Alloc and should be kept in sync
209 if (!size)
210 size = 1; // For VC compatibility, allow 0 sized allocations.
212 IAllocator * const pNext = m_pNext;
213 void * p;
214 BOOL fMoreToPage = FALSE;
216 // Until we actually allocate a block...
219 // Page memory if over limit
220 if (totalAlloc > allocCap)
221 fMoreToPage = ((*m_pfnPage)(size, this) != 0);
223 // Allocate our block
224 AllocThreadLock();
225 p = pNext->AllocEx(size, pszFile, line);
226 if (p)
228 totalAlloc += pNext->GetSize(p);
229 #ifndef SHIP
230 if (totalAlloc > peakAlloc)
231 peakAlloc = totalAlloc;
232 #endif
233 AllocThreadUnlock();
234 return p;
236 AllocThreadUnlock();
238 } while (fMoreToPage);
240 g_fQuietAssert = FALSE;
241 CriticalMsg("Out of memory");
243 return NULL;
246 ///////////////////////////////////////
248 STDMETHODIMP_(void *) cPrimaryMalloc::ReallocEx(void * pOld, ULONG newClientSize, const char * pszFile, int line)
250 // @Note (toml 07-14-97): This code is block copied FROM Realloc and should be kept in sync
252 // Let's handle ANSI behaviors here...
253 if (!pOld)
254 return cPrimaryMalloc::Alloc(newClientSize);
256 if (!newClientSize)
258 cPrimaryMalloc::Free(pOld);
259 return 0;
262 AllocThreadLock();
264 void * pNew;
265 const int oldClientSize = m_pNext->GetSize(pOld);
266 BOOL fMoreToPage = FALSE;
267 const int difference = newClientSize - oldClientSize;
271 if (difference > 0 && m_pfnPage && totalAlloc > allocCap)
273 AllocThreadUnlock();
274 fMoreToPage = ((*m_pfnPage)(difference, this) != 0);
275 AllocThreadLock();
278 pNew = m_pNext->ReallocEx(pOld, newClientSize, pszFile, line);
280 } while (!pNew && fMoreToPage);
282 if (pNew)
284 totalAlloc += m_pNext->GetSize(pNew) - oldClientSize;
285 #ifndef SHIP
286 if (totalAlloc > peakAlloc)
287 peakAlloc = totalAlloc;
288 #endif
290 else
292 g_fQuietAssert = FALSE;
293 CriticalMsg("Out of memory");
296 AllocThreadUnlock();
298 return pNew;
301 ///////////////////////////////////////
303 STDMETHODIMP_(void) cPrimaryMalloc::FreeEx(void * p, const char * pszFile, int line)
305 // @Note (toml 07-14-97): This code is block copied FROM Free and should be kept in sync
306 if (!p)
307 return;
309 AllocThreadLock();
310 IAllocator * const pNext = m_pNext;
311 totalAlloc -= pNext->GetSize(p);
312 pNext->FreeEx(p, pszFile, line);
313 AllocThreadUnlock();
316 ///////////////////////////////////////
318 STDMETHODIMP cPrimaryMalloc::VerifyAlloc(void * p)
320 if (!p)
321 return S_OK;
323 HRESULT result;
325 AllocThreadLock();
326 result = m_pNext->VerifyAlloc(p);
327 AllocThreadUnlock();
329 return result;
332 ///////////////////////////////////////
334 STDMETHODIMP cPrimaryMalloc::VerifyHeap()
336 HRESULT result;
338 AllocThreadLock();
339 result = m_pNext->VerifyHeap();
340 AllocThreadUnlock();
342 return result;
345 #endif
346 ///////////////////////////////////////////////////////////////////////////////
347 #endif