nuclear@3: /************************************************************************************ nuclear@3: nuclear@3: Filename : OVR_Allocator.cpp nuclear@3: Content : Installable memory allocator implementation nuclear@3: Created : September 19, 2012 nuclear@3: Notes : nuclear@3: nuclear@3: Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. nuclear@3: nuclear@3: Use of this software is subject to the terms of the Oculus license nuclear@3: agreement provided at the time of installation or download, or which nuclear@3: otherwise accompanies this software in either electronic or hard copy form. nuclear@3: nuclear@3: ************************************************************************************/ nuclear@3: nuclear@3: #include "OVR_Allocator.h" nuclear@3: #ifdef OVR_OS_MAC nuclear@3: #include nuclear@3: #else nuclear@3: #include nuclear@3: #endif nuclear@3: nuclear@3: namespace OVR { nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Allocator nuclear@3: nuclear@3: Allocator* Allocator::pInstance = 0; nuclear@3: nuclear@3: // Default AlignedAlloc implementation will delegate to Alloc/Free after doing rounding. nuclear@3: void* Allocator::AllocAligned(UPInt size, UPInt align) nuclear@3: { nuclear@3: OVR_ASSERT((align & (align-1)) == 0); nuclear@3: align = (align > sizeof(UPInt)) ? align : sizeof(UPInt); nuclear@3: UPInt p = (UPInt)Alloc(size+align); nuclear@3: UPInt aligned = 0; nuclear@3: if (p) nuclear@3: { nuclear@3: aligned = (UPInt(p) + align-1) & ~(align-1); nuclear@3: if (aligned == p) nuclear@3: aligned += align; nuclear@3: *(((UPInt*)aligned)-1) = aligned-p; nuclear@3: } nuclear@3: return (void*)aligned; nuclear@3: } nuclear@3: nuclear@3: void Allocator::FreeAligned(void* p) nuclear@3: { nuclear@3: UPInt src = UPInt(p) - *(((UPInt*)p)-1); nuclear@3: Free((void*)src); nuclear@3: } nuclear@3: nuclear@3: nuclear@3: //------------------------------------------------------------------------ nuclear@3: // ***** Default Allocator nuclear@3: nuclear@3: // This allocator is created and used if no other allocator is installed. nuclear@3: // Default allocator delegates to system malloc. nuclear@3: nuclear@3: void* DefaultAllocator::Alloc(UPInt size) nuclear@3: { nuclear@3: return malloc(size); nuclear@3: } nuclear@3: void* DefaultAllocator::AllocDebug(UPInt size, const char* file, unsigned line) nuclear@3: { nuclear@3: #if defined(OVR_CC_MSVC) && defined(_CRTDBG_MAP_ALLOC) nuclear@3: return _malloc_dbg(size, _NORMAL_BLOCK, file, line); nuclear@3: #else nuclear@3: OVR_UNUSED2(file, line); nuclear@3: return malloc(size); nuclear@3: #endif nuclear@3: } nuclear@3: nuclear@3: void* DefaultAllocator::Realloc(void* p, UPInt newSize) nuclear@3: { nuclear@3: return realloc(p, newSize); nuclear@3: } nuclear@3: void DefaultAllocator::Free(void *p) nuclear@3: { nuclear@3: return free(p); nuclear@3: } nuclear@3: nuclear@3: nuclear@3: } // OVR