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_INCLUDE_VPX_MEM_TRACKER_H_
13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VPX_MEM_INCLUDE_VPX_MEM_TRACKER_H_
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* vpx_mem_tracker version info */
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vpx_mem_tracker_version "2.5.1.1"
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_TRACKER_VERSION_CHIEF 2
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_TRACKER_VERSION_MAJOR 5
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_TRACKER_VERSION_MINOR 1
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_MEM_TRACKER_VERSION_PATCH 1
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* END - vpx_mem_tracker version info */
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdarg.h>
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct mem_block {
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  size_t addr;
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  unsigned int size,
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           line;
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  char *file;
31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct mem_block *prev,
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      * next;
33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int padded; // This mem_block has padding for integrity checks.
35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // As of right now, this should only be 0 if
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // using vpx_mem_alloc to allocate cache memory.
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // 2005-01-11 tjf
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__cplusplus)
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern "C" {
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_init(int padding_size, int pad_value)
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        padding_size - the size of the padding before and after each mem addr.
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       Values > 0 indicate that integrity checks can be performed
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                       by inspecting these areas.
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        pad_value - the initial value within the padding area before and after
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    each mem addr.
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Initializes the memory tracker interface. Should be called before any
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      other calls to the memory tracker.
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_memory_tracker_init(int padding_size, int pad_value);
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_destroy()
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Deinitializes the memory tracker interface
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void vpx_memory_tracker_destroy();
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_add(size_t addr, unsigned int size,
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           char * file, unsigned int line)
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        addr - memory address to be added to list
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        size - size of addr
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        file - the file addr was referenced from
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        line - the line in file addr was referenced from
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Adds memory address addr, it's size, file and line it came from
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      to the memory tracker allocation table
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void vpx_memory_tracker_add(size_t addr, unsigned int size,
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                              char *file, unsigned int line,
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                              int padded);
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_add(size_t addr, unsigned int size, char * file, unsigned int line)
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        addr - memory address to be added to be removed
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        padded - if 0, disables bounds checking on this memory block even if bounds
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        checking is enabled. (for example, when allocating cache memory, we still want
82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        to check for memory leaks, but we do not waste cache space for bounds check padding)
83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Removes the specified address from the memory tracker's allocation
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      table
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Return:
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        0: on success
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -1: if memory allocation table's mutex could not be locked
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -2: if the addr was not found in the list
89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_memory_tracker_remove(size_t addr);
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_find(unsigned int addr)
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        addr - address to be found in the memory tracker's
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               allocation table
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Return:
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          If found, pointer to the memory block that matches addr
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang          NULL otherwise
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  struct mem_block *vpx_memory_tracker_find(size_t addr);
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_dump()
104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Dumps the current contents of the memory
105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      tracker allocation table
106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void vpx_memory_tracker_dump();
108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_check_integrity()
111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      If a padding_size was provided to vpx_memory_tracker_init()
112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      This function will verify that the region before and after each
113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      memory address contains the specified pad_value. Should the check
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      fail, the filename and line of the check will be printed out.
115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  void vpx_memory_tracker_check_integrity(char *file, unsigned int line);
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_set_log_type
120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        type - value representing the logging type to use
121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        option - type specific option. This will be interpreted differently
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 based on the type.
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Sets the logging type for the memory tracker.
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Values currently supported:
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        0: if option is NULL, log to stderr, otherwise interpret option as a
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           filename and attempt to open it.
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        1: Use output_debug_string (WIN32 only), option ignored
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Return:
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        0: on success
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -1: if the logging type could not be set, because the value was invalid
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            or because a file could not be opened
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_memory_tracker_set_log_type(int type, char *option);
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_set_log_func
137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        userdata - ptr to be passed to the supplied logfunc, can be NULL
138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        logfunc - the logging function to be used to output data from
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                  vpx_memory_track_dump/check_integrity
140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Sets a logging function to be used by the memory tracker.
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Return:
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        0: on success
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -1: if the logging type could not be set because logfunc was NULL
144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_memory_tracker_set_log_func(void *userdata,
146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                      void(*logfunc)(void *userdata,
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                                     const char *fmt, va_list args));
148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* Wrappers to standard library functions. */
150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* mem_track_malloc_func)(size_t);
151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* mem_track_calloc_func)(size_t, size_t);
152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* mem_track_realloc_func)(void *, size_t);
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void (* mem_track_free_func)(void *);
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* mem_track_memcpy_func)(void *, const void *, size_t);
155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* mem_track_memset_func)(void *, int, size_t);
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  typedef void *(* mem_track_memmove_func)(void *, const void *, size_t);
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /*
159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      vpx_memory_tracker_set_functions
160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Sets the function pointers for the standard library functions.
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      Return:
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        0: on success
165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -1: if the use global function pointers is not set.
166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  */
167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int vpx_memory_tracker_set_functions(mem_track_malloc_func g_malloc_l
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, mem_track_calloc_func g_calloc_l
169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, mem_track_realloc_func g_realloc_l
170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, mem_track_free_func g_free_l
171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, mem_track_memcpy_func g_memcpy_l
172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, mem_track_memset_func g_memset_l
173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang, mem_track_memmove_func g_memmove_l);
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__cplusplus)
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // VPX_MEM_INCLUDE_VPX_MEM_TRACKER_H_
180