dnxHeap.c File Reference

Implements debug heap management for DNX. More...

#include "dnxHeap.h"
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <pthread.h>

Go to the source code of this file.

Data Structures

struct  overhead_
 Debug heap block bookkeeping header structure. More...

Defines

#define PICKETSZ   8
 Picket fence size in bytes.
#define PICKET1   0xAA
 Overhead front picket fence fill value.
#define PICKET2   0xBB
 Overhead rear picket fence fill value.
#define PICKET3   0xCC
 User block footer picket fence fill value.
#define ALIGNED   0xDD
 Rear alignment buffer fill value.
#define ALLOCED   0xEE
 User space allocated fill value (malloc).
#define FREED   0xFF
 User space freed memory fill value.
#define ALIGNSZ(sz)   (((sz) + 15) & (-1L << 4))
 Align a block to a paragraph boundary.

Typedefs

typedef struct overhead_ overhead
 Debug heap block bookkeeping header structure.

Functions

static void link_block (overhead *ohp)
 Link a newly allocated block into the block list.
static int unlink_block (overhead *ohp)
 Locate and remove a block by address from the global block list.
static size_t hex_dump (char *buf, void *p, size_t sz)
 Format a number of bytes as a hexadecimal ascii dump into a text buffer.
static void dump_block (overhead *ohp, char *msg)
 Dump a memory block with an optional debug(1) message.
static int memscan (void *p, unsigned char ch, size_t sz)
 Scan a range of memory for the first non-recognized character.
static int check_block (overhead *ohp)
 Check the integrity of a memory block.
void * dnxMalloc (size_t sz, char *file, int line)
 Allocate and track a new heap memory block.
void * dnxCalloc (size_t n, size_t sz, char *file, int line)
 Allocate, zero and track a new heap memory block.
void * dnxRealloc (void *p, size_t sz, char *file, int line)
 Reallocate (and track) an existing heap memory block.
char * dnxStrdup (char *str, char *file, int line)
 Duplicate and track a string from the heap.
void dnxFree (void *p)
 Free and previously allocated (and tracked) heap memory block.
int dnxCheckHeap (void)
 Check the heap and display any unfreed blocks on the global list.

Variables

static overheadhead = 0
 The head of the global heap block list.
static int blkcnt = 0
 The number of blocks in the global list.
static pthread_mutex_t list_lock = PTHREAD_MUTEX_INITIALIZER
 The global heap block list lock.


Detailed Description

Implements debug heap management for DNX.

Author:
John Calcote (jcalcote@users.sourceforge.net)
Attention:
Please submit patches to http://dnx.sourceforge.net

Definition in file dnxHeap.c.


Define Documentation

#define ALIGNED   0xDD

Rear alignment buffer fill value.

Definition at line 42 of file dnxHeap.c.

Referenced by dnxMalloc().

#define ALIGNSZ ( sz   )     (((sz) + 15) & (-1L << 4))

Align a block to a paragraph boundary.

Add 15 and AND the result with 0x...FFFFFFF0 to clear the bottom 4 bits. Works on any word-sized architecture (32, 64, etc).

Definition at line 50 of file dnxHeap.c.

Referenced by dnxMalloc().

#define ALLOCED   0xEE

User space allocated fill value (malloc).

Definition at line 43 of file dnxHeap.c.

Referenced by dnxMalloc().

#define FREED   0xFF

User space freed memory fill value.

Definition at line 44 of file dnxHeap.c.

#define PICKET1   0xAA

Overhead front picket fence fill value.

Definition at line 39 of file dnxHeap.c.

Referenced by check_block(), and dnxMalloc().

#define PICKET2   0xBB

Overhead rear picket fence fill value.

Definition at line 40 of file dnxHeap.c.

Referenced by check_block(), and dnxMalloc().

#define PICKET3   0xCC

User block footer picket fence fill value.

Definition at line 41 of file dnxHeap.c.

Referenced by check_block(), and dnxMalloc().

#define PICKETSZ   8

Picket fence size in bytes.

Definition at line 37 of file dnxHeap.c.

Referenced by check_block(), dnxMalloc(), and dump_block().


Typedef Documentation

typedef struct overhead_ overhead

Debug heap block bookkeeping header structure.


Function Documentation

static int check_block ( overhead ohp  )  [static]

Check the integrity of a memory block.

Parameters:
[in] ohp - a pointer to the block to be checked.
Returns:
Boolean: true (1) if block is okay, false (0) if not.

Definition at line 199 of file dnxHeap.c.

References dump_block(), memscan(), PICKET1, overhead_::picket1, PICKET2, overhead_::picket2, PICKET3, PICKETSZ, and overhead_::reqsz.

Referenced by dnxCheckHeap(), and dnxFree().

void* dnxCalloc ( size_t  n,
size_t  sz,
char *  file,
int  line 
)

Allocate, zero and track a new heap memory block.

Calloc is sort of a strange bird - it should be the same as malloc with the addition of zeroing the block before returning, but K&R must have decided that the X x Y block allocation strategry had some value for heap blocks that need to be cleared...

Parameters:
[in] n - the number of blocks of sz bytes to be allocated.
[in] sz - the size of each of the n blocks to be allocated.
[in] file - the file name from where this function was called.
[in] line - the line number from where this function was called.
Returns:
A pointer to the new memory block, or NULL on allocation failure.

Definition at line 253 of file dnxHeap.c.

References dnxMalloc().

int dnxCheckHeap ( void   ) 

Check the heap and display any unfreed blocks on the global list.

Returns:
Zero on success, or a non-zero error code.

Definition at line 334 of file dnxHeap.c.

References blkcnt, check_block(), dnxDebug(), dump_block(), list_lock, and overhead_::next.

void dnxFree ( void *  p  ) 

Free and previously allocated (and tracked) heap memory block.

Note that there are serveral good programming-practice reasons to call free with a p argument value of null. This debug routine allows it.

Parameters:
[in] p - a pointer to the debug heap block to be freed.

Definition at line 311 of file dnxHeap.c.

References check_block(), dnxDebug(), overhead_::file, and unlink_block().

Referenced by dnxRealloc().

void* dnxMalloc ( size_t  sz,
char *  file,
int  line 
)

Allocate and track a new heap memory block.

malloc allows sz to be zero, in which case, it returns NULL. But there's really no reason to call malloc with a zero value unless the programmer made a mistake, so this routine asserts that sz is non-zero.

Parameters:
[in] sz - the size in bytes of the block to be allocated.
[in] file - the file name from where this function was called.
[in] line - the line number from where this function was called.
Returns:
A pointer to the new memory block, or NULL on allocation failure.

Definition at line 219 of file dnxHeap.c.

References overhead_::actualsz, ALIGNED, ALIGNSZ, ALLOCED, dnxDebug(), overhead_::file, overhead_::line, link_block(), overhead_::next, PICKET1, overhead_::picket1, PICKET2, overhead_::picket2, PICKET3, PICKETSZ, and overhead_::reqsz.

Referenced by dnxCalloc(), dnxRealloc(), and dnxStrdup().

void* dnxRealloc ( void *  p,
size_t  sz,
char *  file,
int  line 
)

Reallocate (and track) an existing heap memory block.

Realloc - the all-in-one heap management function. If p is NULL, realloc acts like malloc, if sz is zero, realloc acts like free.

Since there's no reason except programmer error that would have both p and sz be zero at the same time, this routine asserts one or the other is non-zero.

Parameters:
[in] p - a pointer to the block to be reallocated/resized.
[in] sz - the new size of the block.
[in] file - the file name from where this function was called.
[in] line - the line number from where this function was called.
Returns:
A pointer to the new memory block, or NULL on allocation failure.

Definition at line 270 of file dnxHeap.c.

References dnxFree(), dnxMalloc(), and overhead_::reqsz.

char* dnxStrdup ( char *  str,
char *  file,
int  line 
)

Duplicate and track a string from the heap.

Parameters:
[in] str - a pointer to the zero-terminated string to be duplicated.
[in] file - the file name from where this function was called.
[in] line - the line number from where this function was called.
Returns:
A pointer to the new memory block, or NULL on allocation failure.

Definition at line 292 of file dnxHeap.c.

References dnxMalloc().

static void dump_block ( overhead ohp,
char *  msg 
) [static]

Dump a memory block with an optional debug(1) message.

Parameters:
[in] ohp - a pointer to the block to be displayed.
[in] msg - a pointer to the message to be displayed.

Definition at line 143 of file dnxHeap.c.

References dnxDebug(), overhead_::file, hex_dump(), overhead_::line, overhead_::picket1, overhead_::picket2, PICKETSZ, and overhead_::reqsz.

Referenced by check_block(), and dnxCheckHeap().

static size_t hex_dump ( char *  buf,
void *  p,
size_t  sz 
) [static]

Format a number of bytes as a hexadecimal ascii dump into a text buffer.

Parameters:
[out] buf - a pointer to the text output buffer.
[in] p - a pointer to the bytes to be formatted into buf.
[in] sz - the number of bytes of p to be formatted into buf.
Returns:
The number of characters of buf that were used, minus the trailing null-terminator; buf + this return value is a pointer to the trailing null-terminator just written.

Definition at line 123 of file dnxHeap.c.

Referenced by dump_block().

static void link_block ( overhead ohp  )  [static]

Link a newly allocated block into the block list.

Parameters:
[in] ohp - a pointer to the block to be linked into the global list.

Definition at line 77 of file dnxHeap.c.

References blkcnt, list_lock, and overhead_::next.

Referenced by dnxMalloc().

static int memscan ( void *  p,
unsigned char  ch,
size_t  sz 
) [static]

Scan a range of memory for the first non-recognized character.

Parameters:
[in] p - a pointer to the buffer to be scanned.
[in] ch - the expected fill character.
[in] sz - the number of bytes to be scanned in p.
Returns:
Zero on success, or -1 if not all bytes in the first sz bytes of p are equal to ch.

Definition at line 183 of file dnxHeap.c.

Referenced by check_block().

static int unlink_block ( overhead ohp  )  [static]

Locate and remove a block by address from the global block list.

Parameters:
[in] ohp - a pointer to the block to be located and removed.
Returns:
Boolean; True (1) if found, False (0) if not found in list.

Definition at line 94 of file dnxHeap.c.

References blkcnt, list_lock, and overhead_::next.

Referenced by dnxFree().


Variable Documentation

int blkcnt = 0 [static]

The number of blocks in the global list.

Definition at line 65 of file dnxHeap.c.

Referenced by dnxCheckHeap(), link_block(), and unlink_block().

overhead* head = 0 [static]

The head of the global heap block list.

Definition at line 64 of file dnxHeap.c.

pthread_mutex_t list_lock = PTHREAD_MUTEX_INITIALIZER [static]

The global heap block list lock.

Definition at line 66 of file dnxHeap.c.

Referenced by dnxCheckHeap(), link_block(), and unlink_block().


Generated on Tue Apr 13 15:48:07 2010 for DNX by  doxygen 1.5.6