/*------------------------------------------------------------------------- * drawElements Base Portability Library * ------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Memory management. *//*--------------------------------------------------------------------*/ #include "deMemory.h" #include "deInt32.h" #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> #if defined(DE_VALGRIND_BUILD) # include <valgrind/valgrind.h> # if defined(HAVE_VALGRIND_MEMCHECK_H) # include <valgrind/memcheck.h> # endif #endif DE_BEGIN_EXTERN_C /*--------------------------------------------------------------------*//*! * \brief Allocate a chunk of memory. * \param numBytes Number of bytes to allocate. * \return Pointer to the allocated memory (or null on failure). *//*--------------------------------------------------------------------*/ void* deMalloc (int numBytes) { void* ptr; DE_ASSERT(numBytes > 0); ptr = malloc((size_t)numBytes); #if defined(DE_DEBUG) /* Trash memory in debug builds (if under Valgrind, don't make it think we're initializing data here). */ if (ptr) memset(ptr, 0xcd, numBytes); #if defined(DE_VALGRIND_BUILD) && defined(HAVE_VALGRIND_MEMCHECK_H) if (ptr && RUNNING_ON_VALGRIND) { VALGRIND_MAKE_MEM_UNDEFINED(ptr, numBytes); } #endif #endif return ptr; } /*--------------------------------------------------------------------*//*! * \brief Allocate a chunk of memory and initialize it to zero. * \param numBytes Number of bytes to allocate. * \return Pointer to the allocated memory (or null on failure). *//*--------------------------------------------------------------------*/ void* deCalloc (int numBytes) { void* ptr = deMalloc(numBytes); if (ptr) deMemset(ptr, 0, numBytes); return ptr; } void* deAlignedMalloc (int numBytes, int alignBytes) { int ptrSize = sizeof(void*); deUintptr origPtr = (deUintptr)deMalloc(numBytes + ptrSize + alignBytes); if (origPtr) { deUintptr alignedPtr = (deUintptr)deAlignPtr((void*)(origPtr + ptrSize), alignBytes); deUintptr ptrPtr = (alignedPtr - ptrSize); DE_ASSERT(deInRange32(alignBytes, 0, 256) && deIsPowerOfTwo32(alignBytes)); *(deUintptr*)ptrPtr = origPtr; return (void*)alignedPtr; } else return DE_NULL; } /*--------------------------------------------------------------------*//*! * \brief Reallocate a chunk of memory. * \param ptr Pointer to previously allocated memory block * \param numBytes New size in bytes * \return Pointer to the reallocated (and possibly moved) memory block *//*--------------------------------------------------------------------*/ void* deRealloc (void* ptr, int numBytes) { return realloc(ptr, (size_t)numBytes); } /*--------------------------------------------------------------------*//*! * \brief Free a chunk of memory. * \param ptr Pointer to memory to free. *//*--------------------------------------------------------------------*/ void deFree (void* ptr) { free(ptr); } void deAlignedFree (void* ptr) { if (ptr) { int ptrSize = sizeof(void*); deUintptr ptrPtr = (deUintptr)ptr - ptrSize; deUintptr origPtr = *(deUintptr*)ptrPtr; DE_ASSERT(ptrPtr - origPtr < 256); deFree((void*)origPtr); } } char* deStrdup (const char* str) { #if (DE_COMPILER == DE_COMPILER_MSC) return _strdup(str); #elif (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_IOS) /* For some reason Steve doesn't like stdrup(). */ size_t len = strlen(str); char* copy = malloc(len+1); memcpy(copy, str, len); copy[len] = 0; return copy; #else return strdup(str); #endif } DE_END_EXTERN_C