⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chunk_loc.h

📁 测试内存泄露工具
💻 H
字号:
/* * Local defines for the low level memory routines * * Copyright 2000 by Gray Watson * * This file is part of the dmalloc package. * * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Gray Watson not be used in advertising * or publicity pertaining to distribution of the document or software * without specific, written prior permission. * * Gray Watson makes no representations about the suitability of the * software described herein for any purpose.  It is provided "as is" * without express or implied warranty. * * The author may be contacted via http://dmalloc.com/ * * $Id: chunk_loc.h,v 1.70 2003/06/09 23:14:17 gray Exp $ */#ifndef __CHUNK_LOC_H__#define __CHUNK_LOC_H__#include "conf.h"				/* up here for _INCLUDE */#include "dmalloc_loc.h"			/* for DMALLOC_SIZE *//* for thread-id types -- see conf.h */#if LOG_THREAD_ID#ifdef THREAD_INCLUDE#include THREAD_INCLUDE#endif#endif/* for time type -- see settings.h */#if LOG_PNT_TIMEVAL# ifdef TIMEVAL_INCLUDE#  include TIMEVAL_INCLUDE# endif#else# if LOG_PNT_TIME#  ifdef TIME_INCLUDE#   include TIME_INCLUDE#  endif# endif#endif/* log-bad-space info */#define SPECIAL_CHARS		"\"\"''\\\\n\nr\rt\tb\bf\fa\007"/* * Maximum level in the skip list.  This implies that we can only * store 2^32 entries optimally.  Needless to say this is plenty. */#define MAX_SKIP_LEVEL		32/* memory table settings */#define MEM_ALLOC_ENTRIES	(MEMORY_TABLE_SIZE * 2)#define MEM_CHANGED_ENTRIES	(MEMORY_TABLE_SIZE * 2)/* NOTE: FENCE_BOTTOM_SIZE and FENCE_TOP_SIZE defined in settings.h */#define FENCE_OVERHEAD_SIZE	(FENCE_BOTTOM_SIZE + FENCE_TOP_SIZE)#define FENCE_MAGIC_BOTTOM	0xC0C0AB1B#define FENCE_MAGIC_TOP		0xFACADE69/* smallest allocated block */#define CHUNK_SMALLEST_BLOCK	\	(FENCE_BOTTOM_SIZE + DEFAULT_SMALLEST_ALLOCATION)/* flags associated with the skip_alloc_t type's sa_flags field */#define ALLOC_FLAG_USER		BIT_FLAG(0)	/* slot is user allocated */#define ALLOC_FLAG_FREE		BIT_FLAG(1)	/* slot is free */#define ALLOC_FLAG_EXTERN	BIT_FLAG(2)	/* slot allocated externally */#define ALLOC_FLAG_ADMIN	BIT_FLAG(3)	/* administrative space */#define ALLOC_FLAG_BLANK	BIT_FLAG(4)	/* slot has been blanked */#define ALLOC_FLAG_FENCE	BIT_FLAG(5)	/* slot is fence posted */#define ALLOC_FLAG_VALLOC	BIT_FLAG(6)	/* slot is block aligned *//* * Below defines an allocation structure either on the free or used * list.  It tracks allocations that fit in partial, one, or many * basic-blocks.  It stores some optional fields for recording * information about the pointer. */typedef struct skip_alloc_st {    unsigned char		sa_flags;	/* what it is */    /* some small data types up front to save on space */  unsigned char		sa_level_n;	/* how tall our node is */  unsigned short	sa_line;	/* line where it was allocated */    unsigned int		sa_user_size;	/* size requested by user (wo fence) */  unsigned int		sa_total_size;	/* total size of the block */    void			*sa_mem;	/* pointer to the memory in question */  const char		*sa_file;	/* .c filename where allocated */  unsigned long		sa_use_iter;	/* when last ``used'' */  #if LOG_PNT_SEEN_COUNT  unsigned long		sa_seen_c;	/* times pointer was seen */#endif#if LOG_PNT_ITERATION  unsigned long		sa_iteration;	/* interation when pointer alloced */#endif#if LOG_PNT_TIMEVAL  TIMEVAL_TYPE 		sa_timeval;	/* time when pointer alloced */#else#if LOG_PNT_TIME  TIME_TYPE		sa_time;	/* time when pointer alloced */#endif#endif#if LOG_PNT_THREAD_ID  THREAD_TYPE		sa_thread_id;	/* thread id which allocaed pnt */#endif    /*   * Array of next pointers.  This may extend past the end of the   * function if we allocate for space larger than the structure.   */  struct skip_alloc_st	*sa_next_p[1];  } skip_alloc_t;/* * This macro helps us determine how much memory we need to store to * hold all of the next pointers in the skip-list entry.  So if we are * at level 0 then this will have no extra next pointers since there * already is one inside of skip_alloc_t. */#define SKIP_SLOT_SIZE(next_n)	\	(sizeof(skip_alloc_t) + sizeof(skip_alloc_t *) * (next_n))/* entry block magic numbers */#define ENTRY_BLOCK_MAGIC1	0xEBEB1111	/* for the eb_magic1 field */#define ENTRY_BLOCK_MAGIC2	0xEBEB2222	/* for the eb_magic2 field */#define ENTRY_BLOCK_MAGIC3	0xEBEB3333	/* written at end of eb block*//* * The following structure is written at the front of a skip-list * entry administrative block.   */typedef struct entry_block_st {  unsigned int		eb_magic1;	/* magic number */  unsigned int		eb_level_n;	/* the levels which are stored here */  struct entry_block_st	*eb_next_p;	/* pointer to next block */  unsigned int		eb_magic2;	/* magic number */    skip_alloc_t		eb_first_slot;	/* first slot in the block */    /*   * the rest are after this one but we don't really know the size   * because it is based on the skip-level.   */    /*   * At the end of the block is the MAGIC3 value but we can't define   * it in a structure.   */} entry_block_t;/* * The following structure is used to figure out a number of bits of * information about a user allocation. */typedef struct {  int		pi_fence_b;		/* fence-posts are on for pointer */  int		pi_valloc_b;		/* pointer is valloc-aligned */  int		pi_blanked_b;		/* pointer was blanked */  void		*pi_alloc_start;	/* pnt to start of allocation */  void		*pi_fence_bottom;	/* pnt to the bottom fence area */  void		*pi_user_start;		/* pnt to start of user allocation */  void		*pi_user_bounds;	/* pnt past end of user allocation */  void		*pi_fence_top;		/* pnt to the top fence area */  void		*pi_upper_bounds;	/* pnt to highest available user area*/  void		*pi_alloc_bounds;	/* pnt past end of total allocation */} pnt_info_t;#endif /* ! __CHUNK_LOC_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -