|  | /* | 
|  | *  Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  |  | 
|  | #ifndef VPX_MEM_INCLUDE_VPX_MEM_TRACKER_H_ | 
|  | #define VPX_MEM_INCLUDE_VPX_MEM_TRACKER_H_ | 
|  |  | 
|  | /* vpx_mem_tracker version info */ | 
|  | #define vpx_mem_tracker_version "2.5.1.1" | 
|  |  | 
|  | #define VPX_MEM_TRACKER_VERSION_CHIEF 2 | 
|  | #define VPX_MEM_TRACKER_VERSION_MAJOR 5 | 
|  | #define VPX_MEM_TRACKER_VERSION_MINOR 1 | 
|  | #define VPX_MEM_TRACKER_VERSION_PATCH 1 | 
|  | /* END - vpx_mem_tracker version info */ | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | struct mem_block { | 
|  | size_t addr; | 
|  | unsigned int size, | 
|  | line; | 
|  | char *file; | 
|  | struct mem_block *prev, | 
|  | * next; | 
|  |  | 
|  | int padded; // This mem_block has padding for integrity checks. | 
|  | // As of right now, this should only be 0 if | 
|  | // using vpx_mem_alloc to allocate cache memory. | 
|  | // 2005-01-11 tjf | 
|  | }; | 
|  |  | 
|  | #if defined(__cplusplus) | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_init(int padding_size, int pad_value) | 
|  | padding_size - the size of the padding before and after each mem addr. | 
|  | Values > 0 indicate that integrity checks can be performed | 
|  | by inspecting these areas. | 
|  | pad_value - the initial value within the padding area before and after | 
|  | each mem addr. | 
|  |  | 
|  | Initializes the memory tracker interface. Should be called before any | 
|  | other calls to the memory tracker. | 
|  | */ | 
|  | int vpx_memory_tracker_init(int padding_size, int pad_value); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_destroy() | 
|  | Deinitializes the memory tracker interface | 
|  | */ | 
|  | void vpx_memory_tracker_destroy(); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_add(size_t addr, unsigned int size, | 
|  | char * file, unsigned int line) | 
|  | addr - memory address to be added to list | 
|  | size - size of addr | 
|  | file - the file addr was referenced from | 
|  | line - the line in file addr was referenced from | 
|  | Adds memory address addr, it's size, file and line it came from | 
|  | to the memory tracker allocation table | 
|  | */ | 
|  | void vpx_memory_tracker_add(size_t addr, unsigned int size, | 
|  | char *file, unsigned int line, | 
|  | int padded); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_add(size_t addr, unsigned int size, char * file, unsigned int line) | 
|  | addr - memory address to be added to be removed | 
|  | padded - if 0, disables bounds checking on this memory block even if bounds | 
|  | checking is enabled. (for example, when allocating cache memory, we still want | 
|  | to check for memory leaks, but we do not waste cache space for bounds check padding) | 
|  | Removes the specified address from the memory tracker's allocation | 
|  | table | 
|  | Return: | 
|  | 0: on success | 
|  | -1: if memory allocation table's mutex could not be locked | 
|  | -2: if the addr was not found in the list | 
|  | */ | 
|  | int vpx_memory_tracker_remove(size_t addr); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_find(unsigned int addr) | 
|  | addr - address to be found in the memory tracker's | 
|  | allocation table | 
|  | Return: | 
|  | If found, pointer to the memory block that matches addr | 
|  | NULL otherwise | 
|  | */ | 
|  | struct mem_block *vpx_memory_tracker_find(size_t addr); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_dump() | 
|  | Dumps the current contents of the memory | 
|  | tracker allocation table | 
|  | */ | 
|  | void vpx_memory_tracker_dump(); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_check_integrity() | 
|  | If a padding_size was provided to vpx_memory_tracker_init() | 
|  | This function will verify that the region before and after each | 
|  | memory address contains the specified pad_value. Should the check | 
|  | fail, the filename and line of the check will be printed out. | 
|  | */ | 
|  | void vpx_memory_tracker_check_integrity(char *file, unsigned int line); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_set_log_type | 
|  | type - value representing the logging type to use | 
|  | option - type specific option. This will be interpreted differently | 
|  | based on the type. | 
|  | Sets the logging type for the memory tracker. | 
|  | Values currently supported: | 
|  | 0: if option is NULL, log to stderr, otherwise interpret option as a | 
|  | filename and attempt to open it. | 
|  | 1: Use output_debug_string (WIN32 only), option ignored | 
|  | Return: | 
|  | 0: on success | 
|  | -1: if the logging type could not be set, because the value was invalid | 
|  | or because a file could not be opened | 
|  | */ | 
|  | int vpx_memory_tracker_set_log_type(int type, char *option); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_set_log_func | 
|  | userdata - ptr to be passed to the supplied logfunc, can be NULL | 
|  | logfunc - the logging function to be used to output data from | 
|  | vpx_memory_track_dump/check_integrity | 
|  | Sets a logging function to be used by the memory tracker. | 
|  | Return: | 
|  | 0: on success | 
|  | -1: if the logging type could not be set because logfunc was NULL | 
|  | */ | 
|  | int vpx_memory_tracker_set_log_func(void *userdata, | 
|  | void(*logfunc)(void *userdata, | 
|  | const char *fmt, va_list args)); | 
|  |  | 
|  | /* Wrappers to standard library functions. */ | 
|  | typedef void *(* mem_track_malloc_func)(size_t); | 
|  | typedef void *(* mem_track_calloc_func)(size_t, size_t); | 
|  | typedef void *(* mem_track_realloc_func)(void *, size_t); | 
|  | typedef void (* mem_track_free_func)(void *); | 
|  | typedef void *(* mem_track_memcpy_func)(void *, const void *, size_t); | 
|  | typedef void *(* mem_track_memset_func)(void *, int, size_t); | 
|  | typedef void *(* mem_track_memmove_func)(void *, const void *, size_t); | 
|  |  | 
|  | /* | 
|  | vpx_memory_tracker_set_functions | 
|  |  | 
|  | Sets the function pointers for the standard library functions. | 
|  |  | 
|  | Return: | 
|  | 0: on success | 
|  | -1: if the use global function pointers is not set. | 
|  | */ | 
|  | int vpx_memory_tracker_set_functions(mem_track_malloc_func g_malloc_l | 
|  | , mem_track_calloc_func g_calloc_l | 
|  | , mem_track_realloc_func g_realloc_l | 
|  | , mem_track_free_func g_free_l | 
|  | , mem_track_memcpy_func g_memcpy_l | 
|  | , mem_track_memset_func g_memset_l | 
|  | , mem_track_memmove_func g_memmove_l); | 
|  |  | 
|  | #if defined(__cplusplus) | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif  // VPX_MEM_INCLUDE_VPX_MEM_TRACKER_H_ |