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