1 ///////////////////////////////////////////////////////////////////////////////
2 // $Source: x:/prj/tech/libsrc/lgalloc/RCS/primallc.cpp $
4 // $Date: 1998/06/10 13:58:15 $
18 #pragma code_seg("lgalloc")
20 ///////////////////////////////////////////////////////////////////////////////
22 volatile cFastMutex g_AllocMutex
;
24 ///////////////////////////////////////////////////////////////////////////////
26 // CLASS: cPrimaryMalloc, members
29 cPrimaryMalloc::cPrimaryMalloc()
31 initAllocCap
= 0x2000000;
39 ///////////////////////////////////////
41 cPrimaryMalloc::~cPrimaryMalloc()
46 ///////////////////////////////////////
48 ulong LGAPI
cPrimaryMalloc::DefPageFunc(ulong needed
, sAllocLimits
* pLimits
)
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
59 size
= 1; // For VC compatibility, allow 0 sized allocations.
61 IAllocator
* const pNext
= m_pNext
;
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);
74 p
= pNext
->Alloc(size
);
77 totalAlloc
+= pNext
->GetSize(p
);
79 if (totalAlloc
> peakAlloc
)
80 peakAlloc
= totalAlloc
;
87 } while (fMoreToPage
);
89 g_fQuietAssert
= FALSE
;
90 CriticalMsg("Out of memory");
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...
103 return cPrimaryMalloc::Alloc(newClientSize
);
107 cPrimaryMalloc::Free(pOld
);
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
)
123 fMoreToPage
= ((*m_pfnPage
)(difference
, this) != 0);
127 pNew
= m_pNext
->Realloc(pOld
, newClientSize
);
129 } while (!pNew
&& fMoreToPage
);
133 totalAlloc
+= m_pNext
->GetSize(pNew
) - oldClientSize
;
135 if (totalAlloc
> peakAlloc
)
136 peakAlloc
= totalAlloc
;
141 g_fQuietAssert
= FALSE
;
142 CriticalMsg("Out of memory");
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
159 IAllocator
* const pNext
= m_pNext
;
160 totalAlloc
-= pNext
->GetSize(p
);
165 ///////////////////////////////////////
167 STDMETHODIMP_(ULONG
) cPrimaryMalloc::GetSize(void * p
)
175 result
= m_pNext
->GetSize(p
);
181 ///////////////////////////////////////
183 STDMETHODIMP_(int) cPrimaryMalloc::DidAlloc(void * pv
)
188 result
= m_pNext
->DidAlloc(pv
);
194 ///////////////////////////////////////
196 STDMETHODIMP_(void) cPrimaryMalloc::HeapMinimize()
199 m_pNext
->HeapMinimize();
203 ///////////////////////////////////////
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
210 size
= 1; // For VC compatibility, allow 0 sized allocations.
212 IAllocator
* const pNext
= m_pNext
;
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
225 p
= pNext
->AllocEx(size
, pszFile
, line
);
228 totalAlloc
+= pNext
->GetSize(p
);
230 if (totalAlloc
> peakAlloc
)
231 peakAlloc
= totalAlloc
;
238 } while (fMoreToPage
);
240 g_fQuietAssert
= FALSE
;
241 CriticalMsg("Out of memory");
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...
254 return cPrimaryMalloc::Alloc(newClientSize
);
258 cPrimaryMalloc::Free(pOld
);
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
)
274 fMoreToPage
= ((*m_pfnPage
)(difference
, this) != 0);
278 pNew
= m_pNext
->ReallocEx(pOld
, newClientSize
, pszFile
, line
);
280 } while (!pNew
&& fMoreToPage
);
284 totalAlloc
+= m_pNext
->GetSize(pNew
) - oldClientSize
;
286 if (totalAlloc
> peakAlloc
)
287 peakAlloc
= totalAlloc
;
292 g_fQuietAssert
= FALSE
;
293 CriticalMsg("Out of memory");
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
310 IAllocator
* const pNext
= m_pNext
;
311 totalAlloc
-= pNext
->GetSize(p
);
312 pNext
->FreeEx(p
, pszFile
, line
);
316 ///////////////////////////////////////
318 STDMETHODIMP
cPrimaryMalloc::VerifyAlloc(void * p
)
326 result
= m_pNext
->VerifyAlloc(p
);
332 ///////////////////////////////////////
334 STDMETHODIMP
cPrimaryMalloc::VerifyHeap()
339 result
= m_pNext
->VerifyHeap();
346 ///////////////////////////////////////////////////////////////////////////////