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
12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VPX_MEM_VPX_MEM_H_
13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VPX_MEM_VPX_MEM_H_
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_config.h"
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__uClinux__)
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# include <lddk.h>
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* vpx_mem version info */
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vpx_mem_version "2.2.1.5"
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_VERSION_CHIEF 2
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_VERSION_MAJOR 2
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_VERSION_MINOR 1
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_VERSION_PATCH 5
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* end - vpx_mem version info */
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VPX_TRACK_MEM_USAGE
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber# define VPX_TRACK_MEM_USAGE       0  /* enable memory tracking/integrity checks */
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VPX_CHECK_MEM_FUNCTIONS
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber# define VPX_CHECK_MEM_FUNCTIONS   0  /* enable basic safety checks in _memcpy,
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang_memset, and _memmove */
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef REPLACE_BUILTIN_FUNCTIONS
37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber# define REPLACE_BUILTIN_FUNCTIONS 0  /* replace builtin functions with their
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvpx_ equivalents */
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h>
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stddef.h>
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__cplusplus)
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern "C" {
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_mem_get_version()
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      provided for runtime version checking. Returns an unsigned int of the form
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      CHIEF | MAJOR | MINOR | PATCH, where the chief version number is the high
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      order byte.
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int vpx_mem_get_version(void);
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_mem_set_heap_size(size_t size)
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        size - size in bytes for the memory manager to allocate for its heap
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Sets the memory manager's initial heap size
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Return:
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        0: on success
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -1: if memory manager calls have not been included in the vpx_mem lib
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -2: if the memory manager has been compiled to use static memory
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -3: if the memory manager has already allocated its heap
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_mem_set_heap_size(size_t size);
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_memalign(size_t align, size_t size);
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_malloc(size_t size);
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_calloc(size_t num, size_t size);
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_realloc(void *memblk, size_t size);
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void vpx_free(void *memblk);
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_memcpy(void *dest, const void *src, size_t length);
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_memset(void *dest, int val, size_t length);
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_memmove(void *dest, const void *src, size_t count);
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* special memory functions */
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *vpx_mem_alloc(int id, size_t size, size_t align);
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void vpx_mem_free(int id, void *mem, size_t size);
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* Wrappers to standard library functions. */
83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* g_malloc_func)(size_t);
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* g_calloc_func)(size_t, size_t);
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* g_realloc_func)(void *, size_t);
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void (* g_free_func)(void *);
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* g_memcpy_func)(void *, const void *, size_t);
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* g_memset_func)(void *, int, size_t);
89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* g_memmove_func)(void *, const void *, size_t);
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_mem_set_functions(g_malloc_func g_malloc_l
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_calloc_func g_calloc_l
93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_realloc_func g_realloc_l
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_free_func g_free_l
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memcpy_func g_memcpy_l
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memset_func g_memset_l
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, g_memmove_func g_memmove_l);
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_mem_unset_functions(void);
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* some defines for backward compatibility */
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define DMEM_GENERAL 0
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// (*)<
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if REPLACE_BUILTIN_FUNCTIONS
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# ifndef __VPX_MEM_C__
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define memalign vpx_memalign
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define malloc   vpx_malloc
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define calloc   vpx_calloc
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define realloc  vpx_realloc
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define free     vpx_free
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define memcpy   vpx_memcpy
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define memmove  vpx_memmove
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define memset   vpx_memset
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MEM_TRACKER
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdarg.h>
121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*from vpx_mem/vpx_mem_tracker.c*/
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  extern void vpx_memory_tracker_dump();
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  extern void vpx_memory_tracker_check_integrity(char *file, unsigned int line);
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  extern int vpx_memory_tracker_set_log_type(int type, char *option);
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  extern int vpx_memory_tracker_set_log_func(void *userdata,
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                             void(*logfunc)(void *userdata,
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                                            const char *fmt, va_list args));
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# ifndef __VPX_MEM_C__
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memalign(align, size) xvpx_memalign((align), (size), __FILE__, __LINE__)
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_malloc(size)          xvpx_malloc((size), __FILE__, __LINE__)
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_calloc(num, size)     xvpx_calloc(num, size, __FILE__, __LINE__)
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_realloc(addr, size)   xvpx_realloc(addr, size, __FILE__, __LINE__)
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_free(addr)            xvpx_free(addr, __FILE__, __LINE__)
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memory_tracker_check_integrity() vpx_memory_tracker_check_integrity(__FILE__, __LINE__)
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_mem_alloc(id,size,align) xvpx_mem_alloc(id, size, align, __FILE__, __LINE__)
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_mem_free(id,mem,size) xvpx_mem_free(id, mem, size, __FILE__, __LINE__)
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *xvpx_memalign(size_t align, size_t size, char *file, int line);
140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *xvpx_malloc(size_t size, char *file, int line);
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *xvpx_calloc(size_t num, size_t size, char *file, int line);
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *xvpx_realloc(void *memblk, size_t size, char *file, int line);
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void xvpx_free(void *memblk, char *file, int line);
144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void *xvpx_mem_alloc(int id, size_t size, size_t align, char *file, int line);
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void xvpx_mem_free(int id, void *mem, size_t size, char *file, int line);
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# ifndef __VPX_MEM_C__
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memory_tracker_dump()
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memory_tracker_check_integrity()
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memory_tracker_set_log_type(t,o) 0
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memory_tracker_set_log_func(u,f) 0
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if !VPX_CHECK_MEM_FUNCTIONS
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# ifndef __VPX_MEM_C__
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  include <string.h>
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memcpy  memcpy
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memset  memset
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#  define vpx_memmove memmove
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# endif
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef VPX_MEM_PLTFRM
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# include VPX_MEM_PLTFRM
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__cplusplus)
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // VPX_MEM_VPX_MEM_H_
174