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