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
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct GLOBAL_FUNC_POINTERS
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_malloc_func g_malloc;
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_calloc_func g_calloc;
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_realloc_func g_realloc;
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_free_func g_free;
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_memcpy_func g_memcpy;
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_memset_func g_memset;
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_memmove_func g_memmove;
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} *g_func = NULL;
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MALLOC_L  g_func->g_malloc
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_REALLOC_L g_func->g_realloc
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_FREE_L    g_func->g_free
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMCPY_L  g_func->g_memcpy
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMSET_L  g_func->g_memset
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMMOVE_L g_func->g_memmove
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MALLOC_L  malloc
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_REALLOC_L realloc
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_FREE_L    free
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMCPY_L  memcpy
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMSET_L  memset
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define VPX_MEMMOVE_L memmove
78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /* USE_GLOBAL_FUNCTION_POINTERS */
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vpx_mem_get_version()
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int ver = ((unsigned int)(unsigned char)VPX_MEM_VERSION_CHIEF << 24 |
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        (unsigned int)(unsigned char)VPX_MEM_VERSION_MAJOR << 16 |
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        (unsigned int)(unsigned char)VPX_MEM_VERSION_MINOR << 8  |
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        (unsigned int)(unsigned char)VPX_MEM_VERSION_PATCH);
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return ver;
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vpx_mem_set_heap_size(size_t size)
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ret = -1;
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if MM_DYNAMIC_MEMORY
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!g_mng_memory_allocated && size)
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        g_mm_memory_size = size;
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ret = 0;
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ret = -3;
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ret = -2;
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)size;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return ret;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_memalign(size_t align, size_t size)
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *addr,
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * x = NULL;
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int number_aau;
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (vpx_mm_create_heap_memory() < 0)
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        _P(printf("[vpx][mm] ERROR vpx_memalign() Couldn't create memory for Heap.\n");)
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    number_aau = ((size + align - 1 + ADDRESS_STORAGE_SIZE) >>
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  SHIFT_HMM_ADDR_ALIGN_UNIT) + 1;
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addr = hmm_alloc(&hmm_d, number_aau);
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    addr = VPX_MALLOC_L(size + align - 1 + ADDRESS_STORAGE_SIZE);
133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*CONFIG_MEM_MANAGER*/
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (addr)
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align);
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* save the actual malloc address */
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((size_t *)x)[-1] = (size_t)addr;
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return x;
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_malloc(size_t size)
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return vpx_memalign(DEFAULT_ALIGNMENT, size);
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_calloc(size_t num, size_t size)
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *x;
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    x = vpx_memalign(DEFAULT_ALIGNMENT, num * size);
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (x)
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_MEMSET_L(x, 0, num * size);
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return x;
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_realloc(void *memblk, size_t size)
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *addr,
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * new_addr = NULL;
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int align = DEFAULT_ALIGNMENT;
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    The realloc() function changes the size of the object pointed to by
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr to the size specified by size, and returns a pointer to the
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    possibly moved block. The contents are unchanged up to the lesser
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    of the new and old sizes. If ptr is null, realloc() behaves like
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    malloc() for the specified size. If size is zero (0) and ptr is
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    not a null pointer, the object pointed to is freed.
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    */
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!memblk)
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        new_addr = vpx_malloc(size);
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (!size)
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(memblk);
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        addr   = (void *)(((size_t *)memblk)[-1]);
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        memblk = NULL;
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        new_addr = vpx_mm_realloc(addr, size + align + ADDRESS_STORAGE_SIZE);
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        new_addr = VPX_REALLOC_L(addr, size + align + ADDRESS_STORAGE_SIZE);
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (new_addr)
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            addr = new_addr;
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            new_addr = (void *)(((size_t)
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                 ((unsigned char *)new_addr + ADDRESS_STORAGE_SIZE) + (align - 1)) &
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                (size_t) - align);
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* save the actual malloc address */
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ((size_t *)new_addr)[-1] = (size_t)addr;
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return new_addr;
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vpx_free(void *memblk)
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (memblk)
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        void *addr = (void *)(((size_t *)memblk)[-1]);
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        hmm_free(&hmm_d, addr);
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_FREE_L(addr);
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_TRACKER
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *xvpx_memalign(size_t align, size_t size, char *file, int line)
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *x_bounds;
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *x;
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (g_alloc_count == 0)
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i_rv = vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE);
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i_rv = vpx_memory_tracker_init(0, 0);
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (i_rv < 0)
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init().\n");)
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int tempme = BOUNDS_CHECK_VALUE;
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x_bounds = vpx_memalign(align, size + (BOUNDS_CHECK_PAD_SIZE * 2));
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (x_bounds)
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*we're aligning the address twice here but to keep things
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber              consistent we want to have the padding come before the stored
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber              address so no matter what free function gets called we will
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber              attempt to free the correct address*/
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]);
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE,
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                           (int)align);
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* save the actual malloc address */
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ((size_t *)x)[-1] = (size_t)x_bounds;
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int))
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int));
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                VPX_MEMCPY_L((unsigned char *)x + size + i,
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                             &tempme, sizeof(unsigned int));
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x = NULL;
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    x = vpx_memalign(align, size);
272538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*TRY_BOUNDS_CHECK*/
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_alloc_count++;
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1);
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return x;
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *xvpx_malloc(size_t size, char *file, int line)
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return xvpx_memalign(DEFAULT_ALIGNMENT, size, file, line);
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *xvpx_calloc(size_t num, size_t size, char *file, int line)
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *x = xvpx_memalign(DEFAULT_ALIGNMENT, num * size, file, line);
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (x)
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_MEMSET_L(x, 0, num * size);
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return x;
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *xvpx_realloc(void *memblk, size_t size, char *file, int line)
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    struct mem_block *p = NULL;
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int orig_size = 0,
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        orig_line = 0;
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    char *orig_file = NULL;
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *x_bounds = memblk ?
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              (unsigned char *)(((size_t *)memblk)[-1]) :
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              NULL;
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *x;
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (g_alloc_count == 0)
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE))
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!vpx_memory_tracker_init(0, 0))
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init().\n");)
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if ((p = vpx_memory_tracker_find((size_t)memblk)))
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        orig_size = p->size;
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        orig_file = p->file;
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        orig_line = p->line;
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK_ON_FREE
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memory_tracker_check_integrity(file, line);
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
335538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* have to do this regardless of success, because
336538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * the memory that does get realloc'd may change
337538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     * the bounds values of this block
338538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber     */
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memory_tracker_remove((size_t)memblk);
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int tempme = BOUNDS_CHECK_VALUE;
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x_bounds = vpx_realloc(memblk, size + (BOUNDS_CHECK_PAD_SIZE * 2));
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (x_bounds)
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]);
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE,
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                           (int)DEFAULT_ALIGNMENT);
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* save the actual malloc address */
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ((size_t *)x)[-1] = (size_t)x_bounds;
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int))
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int));
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                VPX_MEMCPY_L((unsigned char *)x + size + i,
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                             &tempme, sizeof(unsigned int));
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x = NULL;
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    x = vpx_realloc(memblk, size);
368538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*TRY_BOUNDS_CHECK*/
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!memblk) ++g_alloc_count;
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (x)
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1);
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_memory_tracker_add((size_t)memblk, orig_size, orig_file, orig_line, 1);
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return x;
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid xvpx_free(void *p_address, char *file, int line)
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *p_bounds_address = (unsigned char *)p_address;
384538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /*p_bounds_address -= BOUNDS_CHECK_PAD_SIZE;*/
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if !TRY_BOUNDS_CHECK_ON_FREE
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)file;
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)line;
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (p_address)
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK_ON_FREE
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_memory_tracker_check_integrity(file, line);
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
398538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* if the addr isn't found in the list, assume it was allocated via
399538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber         * vpx_ calls not xvpx_, therefore it does not contain any padding
400538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber         */
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (vpx_memory_tracker_remove((size_t)p_address) == -2)
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            p_bounds_address = p_address;
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(fprintf(stderr, "[vpx_mem][xvpx_free] addr: %p not found in"
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       " list; freed from file:%s"
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       " line:%d\n", p_address, file, line));
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            --g_alloc_count;
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if TRY_BOUNDS_CHECK
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(p_bounds_address);
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(p_address);
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!g_alloc_count)
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_memory_tracker_destroy();
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif /*CONFIG_MEM_TRACKER*/
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS)
426538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <task_lib.h> /*for task_delay()*/
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* This function is only used to get a stack trace of the player
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberobject so we can se where we are having a problem. */
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int get_my_tt(int task)
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    tt(task);
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 0;
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vx_sleep(int msec)
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ticks_to_sleep = 0;
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (msec)
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int msec_per_tick = 1000 / sys_clk_rate_get();
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (msec < msec_per_tick)
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ticks_to_sleep++;
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ticks_to_sleep = msec / msec_per_tick;
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    task_delay(ticks_to_sleep);
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_memcpy(void *dest, const void *source, size_t length)
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (((int)dest < 0x4000) || ((int)source < 0x4000))
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        _P(printf("WARNING: vpx_memcpy dest:0x%x source:0x%x len:%d\n", (int)dest, (int)source, length);)
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS)
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0);
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vx_sleep(10000);
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_MEMCPY_L(dest, source, length);
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_memset(void *dest, int val, size_t length)
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if ((int)dest < 0x4000)
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        _P(printf("WARNING: vpx_memset dest:0x%x val:%d len:%d\n", (int)dest, val, length);)
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS)
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0);
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vx_sleep(10000);
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_MEMSET_L(dest, val, length);
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid *vpx_memmove(void *dest, const void *src, size_t count)
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_CHECKS
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (((int)dest < 0x4000) || ((int)src < 0x4000))
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        _P(printf("WARNING: vpx_memmove dest:0x%x src:0x%x count:%d\n", (int)dest, (int)src, count);)
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(VXWORKS)
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0);
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vx_sleep(10000);
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return VPX_MEMMOVE_L(dest, src, count);
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_MANAGER
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int vpx_mm_create_heap_memory()
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i_rv = 0;
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!g_mng_memory_allocated)
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if MM_DYNAMIC_MEMORY
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        g_p_mng_memory_raw =
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            (unsigned char *)malloc(g_mm_memory_size + HMM_ADDR_ALIGN_UNIT);
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (g_p_mng_memory_raw)
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            g_p_mng_memory = (unsigned char *)((((unsigned int)g_p_mng_memory_raw) +
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                                HMM_ADDR_ALIGN_UNIT - 1) &
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                               -(int)HMM_ADDR_ALIGN_UNIT);
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(printf("[vpx][mm] total memory size:%d g_p_mng_memory_raw:0x%x g_p_mng_memory:0x%x\n"
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , g_mm_memory_size + HMM_ADDR_ALIGN_UNIT
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , (unsigned int)g_p_mng_memory_raw
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , (unsigned int)g_p_mng_memory);)
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n"
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , g_mm_memory_size);)
54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            i_rv = -1;
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (g_p_mng_memory)
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int chunk_size = 0;
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            g_mng_memory_allocated = 1;
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            hmm_init(&hmm_d);
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            chunk_size = g_mm_memory_size >> SHIFT_HMM_ADDR_ALIGN_UNIT;
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            chunk_size -= DUMMY_END_BLOCK_BAUS;
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(printf("[vpx][mm] memory size:%d for vpx memory manager. g_p_mng_memory:0x%x  chunk_size:%d\n"
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , g_mm_memory_size
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , (unsigned int)g_p_mng_memory
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , chunk_size);)
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            hmm_new_chunk(&hmm_d, (void *)g_p_mng_memory, chunk_size);
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if MM_DYNAMIC_MEMORY
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n"
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      , g_mm_memory_size);)
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            i_rv = -1;
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return i_rv;
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void *vpx_mm_realloc(void *memblk, size_t size)
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *p_ret = NULL;
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (vpx_mm_create_heap_memory() < 0)
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        _P(printf("[vpx][mm] ERROR vpx_mm_realloc() Couldn't create memory for Heap.\n");)
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i_rv = 0;
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int old_num_aaus;
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int new_num_aaus;
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        old_num_aaus = hmm_true_size(memblk);
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1;
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (old_num_aaus == new_num_aaus)
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            p_ret = memblk;
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            i_rv = hmm_resize(&hmm_d, memblk, new_num_aaus);
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (i_rv == 0)
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                p_ret = memblk;
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                /* Error. Try to malloc and then copy data. */
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                void *p_from_malloc;
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1;
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                p_from_malloc  = hmm_alloc(&hmm_d, new_num_aaus);
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (p_from_malloc)
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vpx_memcpy(p_from_malloc, memblk, size);
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    hmm_free(&hmm_d, memblk);
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    p_ret = p_from_malloc;
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return p_ret;
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
632538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*CONFIG_MEM_MANAGER*/
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# if CONFIG_MEM_TRACKER
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vpx_memory_tracker_set_functions(g_malloc_func g_malloc_l
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        , g_calloc_func g_calloc_l
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        , g_realloc_func g_realloc_l
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        , g_free_func g_free_l
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        , g_memcpy_func g_memcpy_l
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        , g_memset_func g_memset_l
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        , g_memmove_func g_memmove_l);
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif
644538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif /*USE_GLOBAL_FUNCTION_POINTERS*/
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vpx_mem_set_functions(g_malloc_func g_malloc_l
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                          , g_calloc_func g_calloc_l
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                          , g_realloc_func g_realloc_l
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                          , g_free_func g_free_l
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                          , g_memcpy_func g_memcpy_l
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                          , g_memset_func g_memset_l
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                          , g_memmove_func g_memmove_l)
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* If use global functions is turned on then the
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    application must set the global functions before
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    it does anything else or vpx_mem will have
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unpredictable results. */
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!g_func)
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        g_func = (struct GLOBAL_FUNC_POINTERS *)
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                 g_malloc_l(sizeof(struct GLOBAL_FUNC_POINTERS));
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!g_func)
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return -1;
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_TRACKER
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int rv = 0;
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rv = vpx_memory_tracker_set_functions(g_malloc_l
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                              , g_calloc_l
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                              , g_realloc_l
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                              , g_free_l
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                              , g_memcpy_l
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                              , g_memset_l
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                              , g_memmove_l);
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rv < 0)
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return rv;
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_malloc  = g_malloc_l;
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_calloc  = g_calloc_l;
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_realloc = g_realloc_l;
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_free    = g_free_l;
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_memcpy  = g_memcpy_l;
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_memset  = g_memset_l;
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    g_func->g_memmove = g_memmove_l;
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 0;
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_malloc_l;
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_calloc_l;
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_realloc_l;
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_free_l;
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_memcpy_l;
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_memset_l;
70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void)g_memmove_l;
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return -1;
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vpx_mem_unset_functions()
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if USE_GLOBAL_FUNCTION_POINTERS
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (g_func)
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        g_free_func temp_free = g_func->g_free;
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        temp_free(g_func);
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        g_func = NULL;
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 0;
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
723