190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define __VPX_MEM_C__ 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem.h" 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h> 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h> 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h> 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "include/vpx_mem_intrnl.h" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_TRACKER 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VPX_NO_GLOBALS 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long g_alloc_count = 0; 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_global_handling.h" 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define g_alloc_count vpxglobalm(vpxmem,g_alloc_count) 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# include "heapmm.h" 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# include "hmm_intrnl.h" 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define SHIFT_HMM_ADDR_ALIGN_UNIT 5 34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber# define TOTAL_MEMORY_TO_ALLOCATE 20971520 /* 20 * 1024 * 1024 */ 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define MM_DYNAMIC_MEMORY 1 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# if MM_DYNAMIC_MEMORY 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned char *g_p_mng_memory_raw = NULL; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned char *g_p_mng_memory = NULL; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# else 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned char g_p_mng_memory[TOTAL_MEMORY_TO_ALLOCATE]; 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic size_t g_mm_memory_size = TOTAL_MEMORY_TO_ALLOCATE; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic hmm_descriptor hmm_d; 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int g_mng_memory_allocated = 0; 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int vpx_mm_create_heap_memory(); 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void *vpx_mm_realloc(void *memblk, size_t size); 51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*CONFIG_MEM_MANAGER*/ 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct GLOBAL_FUNC_POINTERS { 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_malloc_func g_malloc; 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_calloc_func g_calloc; 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_realloc_func g_realloc; 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_free_func g_free; 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_memcpy_func g_memcpy; 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_memset_func g_memset; 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_memmove_func g_memmove; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} *g_func = NULL; 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MALLOC_L g_func->g_malloc 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_REALLOC_L g_func->g_realloc 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_FREE_L g_func->g_free 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMCPY_L g_func->g_memcpy 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMSET_L g_func->g_memset 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMMOVE_L g_func->g_memmove 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MALLOC_L malloc 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_REALLOC_L realloc 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_FREE_L free 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMCPY_L memcpy 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMSET_L memset 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMMOVE_L memmove 77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /* USE_GLOBAL_FUNCTION_POINTERS */ 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangunsigned int vpx_mem_get_version() { 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int ver = ((unsigned int)(unsigned char)VPX_MEM_VERSION_CHIEF << 24 | 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (unsigned int)(unsigned char)VPX_MEM_VERSION_MAJOR << 16 | 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (unsigned int)(unsigned char)VPX_MEM_VERSION_MINOR << 8 | 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (unsigned int)(unsigned char)VPX_MEM_VERSION_PATCH); 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ver; 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vpx_mem_set_heap_size(size_t size) { 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ret = -1; 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if MM_DYNAMIC_MEMORY 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!g_mng_memory_allocated && size) { 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_mm_memory_size = size; 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = 0; 96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else 97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = -3; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = -2; 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)size; 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_memalign(size_t align, size_t size) { 110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *addr, 111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * x = NULL; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER 114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int number_aau; 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vpx_mm_create_heap_memory() < 0) { 117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("[vpx][mm] ERROR vpx_memalign() Couldn't create memory for Heap.\n");) 118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang number_aau = ((size + align - 1 + ADDRESS_STORAGE_SIZE) >> 121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang addr = hmm_alloc(&hmm_d, number_aau); 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang addr = VPX_MALLOC_L(size + align - 1 + ADDRESS_STORAGE_SIZE); 126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*CONFIG_MEM_MANAGER*/ 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (addr) { 129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align); 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* save the actual malloc address */ 131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ((size_t *)x)[-1] = (size_t)addr; 132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return x; 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_malloc(size_t size) { 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return vpx_memalign(DEFAULT_ALIGNMENT, size); 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_calloc(size_t num, size_t size) { 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *x; 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = vpx_memalign(DEFAULT_ALIGNMENT, num * size); 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x) 147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_MEMSET_L(x, 0, num * size); 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return x; 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_realloc(void *memblk, size_t size) { 153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *addr, 154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * new_addr = NULL; 155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int align = DEFAULT_ALIGNMENT; 156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* 158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang The realloc() function changes the size of the object pointed to by 159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ptr to the size specified by size, and returns a pointer to the 160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang possibly moved block. The contents are unchanged up to the lesser 161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang of the new and old sizes. If ptr is null, realloc() behaves like 162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang malloc() for the specified size. If size is zero (0) and ptr is 163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang not a null pointer, the object pointed to is freed. 164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!memblk) 166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang new_addr = vpx_malloc(size); 167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (!size) 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(memblk); 169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else { 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang addr = (void *)(((size_t *)memblk)[-1]); 171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memblk = NULL; 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang new_addr = vpx_mm_realloc(addr, size + align + ADDRESS_STORAGE_SIZE); 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang new_addr = VPX_REALLOC_L(addr, size + align + ADDRESS_STORAGE_SIZE); 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (new_addr) { 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang addr = new_addr; 181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang new_addr = (void *)(((size_t) 182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ((unsigned char *)new_addr + ADDRESS_STORAGE_SIZE) + (align - 1)) & 183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (size_t) - align); 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* save the actual malloc address */ 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ((size_t *)new_addr)[-1] = (size_t)addr; 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return new_addr; 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vpx_free(void *memblk) { 193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (memblk) { 194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *addr = (void *)(((size_t *)memblk)[-1]); 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER 196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang hmm_free(&hmm_d, addr); 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_FREE_L(addr); 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_TRACKER 204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *xvpx_memalign(size_t align, size_t size, char *file, int line) { 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned char *x_bounds; 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *x; 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (g_alloc_count == 0) { 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i_rv = vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE); 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i_rv = vpx_memory_tracker_init(0, 0); 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (i_rv < 0) { 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init().\n");) 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int tempme = BOUNDS_CHECK_VALUE; 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x_bounds = vpx_memalign(align, size + (BOUNDS_CHECK_PAD_SIZE * 2)); 229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x_bounds) { 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /*we're aligning the address twice here but to keep things 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang consistent we want to have the padding come before the stored 233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang address so no matter what free function gets called we will 234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang attempt to free the correct address*/ 235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); 236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE, 237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (int)align); 238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* save the actual malloc address */ 239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ((size_t *)x)[-1] = (size_t)x_bounds; 240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) { 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); 243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_MEMCPY_L((unsigned char *)x + size + i, 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &tempme, sizeof(unsigned int)); 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else 247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = NULL; 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = vpx_memalign(align, size); 251538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*TRY_BOUNDS_CHECK*/ 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_alloc_count++; 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1); 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return x; 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *xvpx_malloc(size_t size, char *file, int line) { 261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return xvpx_memalign(DEFAULT_ALIGNMENT, size, file, line); 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *xvpx_calloc(size_t num, size_t size, char *file, int line) { 265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *x = xvpx_memalign(DEFAULT_ALIGNMENT, num * size, file, line); 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x) 268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_MEMSET_L(x, 0, num * size); 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return x; 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *xvpx_realloc(void *memblk, size_t size, char *file, int line) { 274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct mem_block *p = NULL; 275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int orig_size = 0, 276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang orig_line = 0; 277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang char *orig_file = NULL; 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned char *x_bounds = memblk ? 281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (unsigned char *)(((size_t *)memblk)[-1]) : 282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NULL; 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *x; 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (g_alloc_count == 0) { 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE)) 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!vpx_memory_tracker_init(0, 0)) 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init().\n");) 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((p = vpx_memory_tracker_find((size_t)memblk))) { 300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang orig_size = p->size; 301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang orig_file = p->file; 302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang orig_line = p->line; 303ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK_ON_FREE 306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_check_integrity(file, line); 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* have to do this regardless of success, because 310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * the memory that does get realloc'd may change 311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * the bounds values of this block 312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_remove((size_t)memblk); 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int tempme = BOUNDS_CHECK_VALUE; 319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x_bounds = vpx_realloc(memblk, size + (BOUNDS_CHECK_PAD_SIZE * 2)); 321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x_bounds) { 323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); 324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE, 325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (int)DEFAULT_ALIGNMENT); 326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* save the actual malloc address */ 327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ((size_t *)x)[-1] = (size_t)x_bounds; 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) { 330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); 331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VPX_MEMCPY_L((unsigned char *)x + size + i, 332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &tempme, sizeof(unsigned int)); 333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else 335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = NULL; 336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x = vpx_realloc(memblk, size); 339538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*TRY_BOUNDS_CHECK*/ 34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!memblk) ++g_alloc_count; 34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x) 344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1); 345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_add((size_t)memblk, orig_size, orig_file, orig_line, 1); 34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return x; 34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid xvpx_free(void *p_address, char *file, int line) { 35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned char *p_bounds_address = (unsigned char *)p_address; 354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /*p_bounds_address -= BOUNDS_CHECK_PAD_SIZE;*/ 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if !TRY_BOUNDS_CHECK_ON_FREE 358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)file; 359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)line; 36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 362ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (p_address) { 36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK_ON_FREE 364ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_check_integrity(file, line); 36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* if the addr isn't found in the list, assume it was allocated via 368ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vpx_ calls not xvpx_, therefore it does not contain any padding 369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vpx_memory_tracker_remove((size_t)p_address) == -2) { 371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang p_bounds_address = p_address; 372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(fprintf(stderr, "[vpx_mem][xvpx_free] addr: %p not found in" 373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " list; freed from file:%s" 374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " line:%d\n", p_address, file, line)); 375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else 376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang --g_alloc_count; 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK 379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(p_bounds_address); 38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(p_address); 38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!g_alloc_count) 385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memory_tracker_destroy(); 386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif /*CONFIG_MEM_TRACKER*/ 39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS 39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS) 393538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <task_lib.h> /*for task_delay()*/ 39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* This function is only used to get a stack trace of the player 39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberobject so we can se where we are having a problem. */ 396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int get_my_tt(int task) { 397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang tt(task); 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void vx_sleep(int msec) { 403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ticks_to_sleep = 0; 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (msec) { 406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int msec_per_tick = 1000 / sys_clk_rate_get(); 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (msec < msec_per_tick) 409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ticks_to_sleep++; 410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ticks_to_sleep = msec / msec_per_tick; 412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang task_delay(ticks_to_sleep); 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_memcpy(void *dest, const void *source, size_t length) { 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (((int)dest < 0x4000) || ((int)source < 0x4000)) { 423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("WARNING: vpx_memcpy dest:0x%x source:0x%x len:%d\n", (int)dest, (int)source, length);) 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS) 426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vx_sleep(10000); 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return VPX_MEMCPY_L(dest, source, length); 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 437ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_memset(void *dest, int val, size_t length) { 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 440ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((int)dest < 0x4000) { 441ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("WARNING: vpx_memset dest:0x%x val:%d len:%d\n", (int)dest, val, length);) 44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS) 444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); 44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vx_sleep(10000); 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 448ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 452ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return VPX_MEMSET_L(dest, val, length); 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid *vpx_memmove(void *dest, const void *src, size_t count) { 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 458ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (((int)dest < 0x4000) || ((int)src < 0x4000)) { 459ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("WARNING: vpx_memmove dest:0x%x src:0x%x count:%d\n", (int)dest, (int)src, count);) 46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS) 462ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); 46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vx_sleep(10000); 46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 466ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 470ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return VPX_MEMMOVE_L(dest, src, count); 47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER 47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int vpx_mm_create_heap_memory() { 476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i_rv = 0; 47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!g_mng_memory_allocated) { 47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if MM_DYNAMIC_MEMORY 480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_p_mng_memory_raw = 481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (unsigned char *)malloc(g_mm_memory_size + HMM_ADDR_ALIGN_UNIT); 482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (g_p_mng_memory_raw) { 484ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_p_mng_memory = (unsigned char *)((((unsigned int)g_p_mng_memory_raw) + 485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang HMM_ADDR_ALIGN_UNIT - 1) & 486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang -(int)HMM_ADDR_ALIGN_UNIT); 487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("[vpx][mm] total memory size:%d g_p_mng_memory_raw:0x%x g_p_mng_memory:0x%x\n" 489ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_mm_memory_size + HMM_ADDR_ALIGN_UNIT 490ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, (unsigned int)g_p_mng_memory_raw 491ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, (unsigned int)g_p_mng_memory);) 492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n" 494ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_mm_memory_size);) 495ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 496ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang i_rv = -1; 497ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 499ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (g_p_mng_memory) 50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 501ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 502ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int chunk_size = 0; 50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 504ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_mng_memory_allocated = 1; 50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 506ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang hmm_init(&hmm_d); 50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 508ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang chunk_size = g_mm_memory_size >> SHIFT_HMM_ADDR_ALIGN_UNIT; 50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 510ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang chunk_size -= DUMMY_END_BLOCK_BAUS; 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 512ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("[vpx][mm] memory size:%d for vpx memory manager. g_p_mng_memory:0x%x chunk_size:%d\n" 513ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_mm_memory_size 514ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, (unsigned int)g_p_mng_memory 515ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, chunk_size);) 51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 517ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang hmm_new_chunk(&hmm_d, (void *)g_p_mng_memory, chunk_size); 518ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if MM_DYNAMIC_MEMORY 521ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else { 522ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n" 523ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_mm_memory_size);) 52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 525ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang i_rv = -1; 526ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 529ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 531ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return i_rv; 53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 534ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void *vpx_mm_realloc(void *memblk, size_t size) { 535ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *p_ret = NULL; 53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vpx_mm_create_heap_memory() < 0) { 538ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang _P(printf("[vpx][mm] ERROR vpx_mm_realloc() Couldn't create memory for Heap.\n");) 539ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 540ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i_rv = 0; 541ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int old_num_aaus; 542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int new_num_aaus; 543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 544ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang old_num_aaus = hmm_true_size(memblk); 545ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; 546ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (old_num_aaus == new_num_aaus) { 548ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang p_ret = memblk; 549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 550ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang i_rv = hmm_resize(&hmm_d, memblk, new_num_aaus); 551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 552ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (i_rv == 0) { 553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang p_ret = memblk; 554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Error. Try to malloc and then copy data. */ 556ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *p_from_malloc; 55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; 559ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang p_from_malloc = hmm_alloc(&hmm_d, new_num_aaus); 56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (p_from_malloc) { 562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_memcpy(p_from_malloc, memblk, size); 563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang hmm_free(&hmm_d, memblk); 564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 565ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang p_ret = p_from_malloc; 56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 567ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 569ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return p_ret; 57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 573538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*CONFIG_MEM_MANAGER*/ 57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS 57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# if CONFIG_MEM_TRACKER 57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vpx_memory_tracker_set_functions(g_malloc_func g_malloc_l 578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_calloc_func g_calloc_l 579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_realloc_func g_realloc_l 580ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_free_func g_free_l 581ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memcpy_func g_memcpy_l 582ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memset_func g_memset_l 583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memmove_func g_memmove_l); 58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif 585538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*USE_GLOBAL_FUNCTION_POINTERS*/ 58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vpx_mem_set_functions(g_malloc_func g_malloc_l 587ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_calloc_func g_calloc_l 588ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_realloc_func g_realloc_l 589ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_free_func g_free_l 590ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memcpy_func g_memcpy_l 591ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memset_func g_memset_l 592ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memmove_func g_memmove_l) { 59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS 59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 595ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* If use global functions is turned on then the 596ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang application must set the global functions before 597ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang it does anything else or vpx_mem will have 598ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unpredictable results. */ 599ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!g_func) { 600ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func = (struct GLOBAL_FUNC_POINTERS *) 601ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_malloc_l(sizeof(struct GLOBAL_FUNC_POINTERS)); 60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 603ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!g_func) { 604ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 606ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_TRACKER 609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 610ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int rv = 0; 611ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rv = vpx_memory_tracker_set_functions(g_malloc_l 612ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_calloc_l 613ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_realloc_l 614ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_free_l 615ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memcpy_l 616ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memset_l 617ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memmove_l); 618ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 619ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (rv < 0) { 620ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return rv; 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 622ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 625ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_malloc = g_malloc_l; 626ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_calloc = g_calloc_l; 627ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_realloc = g_realloc_l; 628ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_free = g_free_l; 629ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_memcpy = g_memcpy_l; 630ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_memset = g_memset_l; 631ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func->g_memmove = g_memmove_l; 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 633ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 635ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_malloc_l; 636ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_calloc_l; 637ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_realloc_l; 638ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_free_l; 639ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_memcpy_l; 640ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_memset_l; 641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (void)g_memmove_l; 642ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 646ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vpx_mem_unset_functions() { 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS 64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 649ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (g_func) { 650ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_free_func temp_free = g_func->g_free; 651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang temp_free(g_func); 652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang g_func = NULL; 653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 656ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 658