/*
 *  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_H__
#define __VPX_MEM_H__

#include "vpx_config.h"
#if defined(__uClinux__)
# include <lddk.h>
#endif

/* vpx_mem version info */
#define vpx_mem_version "2.2.1.5"

#define VPX_MEM_VERSION_CHIEF 2
#define VPX_MEM_VERSION_MAJOR 2
#define VPX_MEM_VERSION_MINOR 1
#define VPX_MEM_VERSION_PATCH 5
/* end - vpx_mem version info */

#ifndef VPX_TRACK_MEM_USAGE
# define VPX_TRACK_MEM_USAGE       0  /* enable memory tracking/integrity checks */
#endif
#ifndef VPX_CHECK_MEM_FUNCTIONS
# define VPX_CHECK_MEM_FUNCTIONS   0  /* enable basic safety checks in _memcpy,
_memset, and _memmove */
#endif
#ifndef REPLACE_BUILTIN_FUNCTIONS
# define REPLACE_BUILTIN_FUNCTIONS 0  /* replace builtin functions with their
vpx_ equivalents */
#endif

#include <stdlib.h>
#include <stddef.h>

#if defined(__cplusplus)
extern "C" {
#endif

  /*
      vpx_mem_get_version()
      provided for runtime version checking. Returns an unsigned int of the form
      CHIEF | MAJOR | MINOR | PATCH, where the chief version number is the high
      order byte.
  */
  unsigned int vpx_mem_get_version(void);

  /*
      vpx_mem_set_heap_size(size_t size)
        size - size in bytes for the memory manager to allocate for its heap
      Sets the memory manager's initial heap size
      Return:
        0: on success
        -1: if memory manager calls have not been included in the vpx_mem lib
        -2: if the memory manager has been compiled to use static memory
        -3: if the memory manager has already allocated its heap
  */
  int vpx_mem_set_heap_size(size_t size);

  void *vpx_memalign(size_t align, size_t size);
  void *vpx_malloc(size_t size);
  void *vpx_calloc(size_t num, size_t size);
  void *vpx_realloc(void *memblk, size_t size);
  void vpx_free(void *memblk);

  void *vpx_memcpy(void *dest, const void *src, size_t length);
  void *vpx_memset(void *dest, int val, size_t length);
  void *vpx_memmove(void *dest, const void *src, size_t count);

  /* special memory functions */
  void *vpx_mem_alloc(int id, size_t size, size_t align);
  void vpx_mem_free(int id, void *mem, size_t size);

  /* Wrappers to standard library functions. */
  typedef void *(* g_malloc_func)(size_t);
  typedef void *(* g_calloc_func)(size_t, size_t);
  typedef void *(* g_realloc_func)(void *, size_t);
  typedef void (* g_free_func)(void *);
  typedef void *(* g_memcpy_func)(void *, const void *, size_t);
  typedef void *(* g_memset_func)(void *, int, size_t);
  typedef void *(* g_memmove_func)(void *, const void *, size_t);

  int vpx_mem_set_functions(g_malloc_func g_malloc_l
, g_calloc_func g_calloc_l
, g_realloc_func g_realloc_l
, g_free_func g_free_l
, g_memcpy_func g_memcpy_l
, g_memset_func g_memset_l
, g_memmove_func g_memmove_l);
  int vpx_mem_unset_functions(void);


  /* some defines for backward compatibility */
#define DMEM_GENERAL 0

// (*)<

#if REPLACE_BUILTIN_FUNCTIONS
# ifndef __VPX_MEM_C__
#  define memalign vpx_memalign
#  define malloc   vpx_malloc
#  define calloc   vpx_calloc
#  define realloc  vpx_realloc
#  define free     vpx_free
#  define memcpy   vpx_memcpy
#  define memmove  vpx_memmove
#  define memset   vpx_memset
# endif
#endif

#if CONFIG_MEM_TRACKER
#include <stdarg.h>
  /*from vpx_mem/vpx_mem_tracker.c*/
  extern void vpx_memory_tracker_dump();
  extern void vpx_memory_tracker_check_integrity(char *file, unsigned int line);
  extern int vpx_memory_tracker_set_log_type(int type, char *option);
  extern int vpx_memory_tracker_set_log_func(void *userdata,
                                             void(*logfunc)(void *userdata,
                                                            const char *fmt, va_list args));
# ifndef __VPX_MEM_C__
#  define vpx_memalign(align, size) xvpx_memalign((align), (size), __FILE__, __LINE__)
#  define vpx_malloc(size)          xvpx_malloc((size), __FILE__, __LINE__)
#  define vpx_calloc(num, size)     xvpx_calloc(num, size, __FILE__, __LINE__)
#  define vpx_realloc(addr, size)   xvpx_realloc(addr, size, __FILE__, __LINE__)
#  define vpx_free(addr)            xvpx_free(addr, __FILE__, __LINE__)
#  define vpx_memory_tracker_check_integrity() vpx_memory_tracker_check_integrity(__FILE__, __LINE__)
#  define vpx_mem_alloc(id,size,align) xvpx_mem_alloc(id, size, align, __FILE__, __LINE__)
#  define vpx_mem_free(id,mem,size) xvpx_mem_free(id, mem, size, __FILE__, __LINE__)
# endif

  void *xvpx_memalign(size_t align, size_t size, char *file, int line);
  void *xvpx_malloc(size_t size, char *file, int line);
  void *xvpx_calloc(size_t num, size_t size, char *file, int line);
  void *xvpx_realloc(void *memblk, size_t size, char *file, int line);
  void xvpx_free(void *memblk, char *file, int line);
  void *xvpx_mem_alloc(int id, size_t size, size_t align, char *file, int line);
  void xvpx_mem_free(int id, void *mem, size_t size, char *file, int line);

#else
# ifndef __VPX_MEM_C__
#  define vpx_memory_tracker_dump()
#  define vpx_memory_tracker_check_integrity()
#  define vpx_memory_tracker_set_log_type(t,o) 0
#  define vpx_memory_tracker_set_log_func(u,f) 0
# endif
#endif

#if !VPX_CHECK_MEM_FUNCTIONS
# ifndef __VPX_MEM_C__
#  include <string.h>
#  define vpx_memcpy  memcpy
#  define vpx_memset  memset
#  define vpx_memmove memmove
# endif
#endif

#ifdef VPX_MEM_PLTFRM
# include VPX_MEM_PLTFRM
#endif

#if defined(__cplusplus)
}
#endif

#endif /* __VPX_MEM_H__ */
