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