//+--------------------------------------------------------------------------- // // Copyright (C) Microsoft Corporation, 1997. // // alloc.h // // Global allocation macros and routines. // // History: // Mon Jun 02 16:53:42 1997 -by- Drew Bliss [drewb] // Created // //---------------------------------------------------------------------------- #ifndef __ALLOC_H__ #define __ALLOC_H__ #include // // Usage notes: // // ALLOC is a direct replacement for malloc(). // ALLOCZ allocates zero-filled memory. // REALLOC is a direct replacement for realloc(). // FREE is a direct replacement for free(). // // On debug builds these macros evaluate to calls to a memory-tracking // allocator. On free builds they make direct heap calls. // All of the rest of the allocation routines are built on top of the // above macros and so inherit their tracking capabilities. // // The basic allocation routines also provide a mechanism to randomly // cause allocations to fail via manipulation of the glRandomMallocFail // variable. // #if DBG extern long glRandomMallocFail; void * FASTCALL dbgAlloc(UINT nbytes, DWORD flags); void * FASTCALL dbgRealloc(void *mem, UINT nbytes); void FASTCALL dbgFree(void *mem); int FASTCALL dbgMemSize(void *mem); #define ALLOC(nbytes) dbgAlloc((nbytes), 0) #define ALLOCZ(nbytes) dbgAlloc((nbytes), HEAP_ZERO_MEMORY) #define REALLOC(mem, nbytes) dbgRealloc((mem), (nbytes)) #define FREE(mem) dbgFree((mem)) #else // DBG #define ALLOC(nbytes) HeapAlloc(GetProcessHeap(), 0, (nbytes)) #define ALLOCZ(nbytes) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, \ (nbytes)) #define REALLOC(mem, nbytes) HeapReAlloc(GetProcessHeap(), 0, (mem), \ (nbytes)) #define FREE(mem) HeapFree(GetProcessHeap(), 0, (mem)) #endif // DBG // // 32-byte aligned memory allocator. // void * FASTCALL AllocAlign32(UINT nbytes); void FASTCALL FreeAlign32(void *mem); // // Short-lived memory allocator. This allocator should be used // for relatively small allocations (<= 4K) that are only live for // a function or two. // BOOL FASTCALL InitTempAlloc(void); void * FASTCALL gcTempAlloc(__GLcontext *gc, UINT nbytes); void FASTCALL gcTempFree(__GLcontext *gc, void *mem); // // Allocator wrappers which automatically set the gc error on failure. // The wrappers don't currently do anything extra on frees but // having matching free calls allows for per-gc tracking if necessary. // // Internal worker function. void * FASTCALL gcAlloc(__GLcontext *gc, UINT nbytes, DWORD flags); #define GCALLOC(gc, nbytes) gcAlloc((gc), (nbytes), 0) #define GCALLOCZ(gc, nbytes) gcAlloc((gc), (nbytes), HEAP_ZERO_MEMORY) void * FASTCALL GCREALLOC(__GLcontext *gc, void *mem, UINT nbytes); #define GCFREE(gc, mem) FREE(mem) void * FASTCALL GCALLOCALIGN32(__GLcontext *gc, UINT nbytes); #define GCFREEALIGN32(gc, mem) FreeAlign32(mem) #endif // #ifndef __ALLOC_H__