home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
varia
/
toolmanager
/
source
/
global_memory.c
< prev
next >
Wrap
C/C++ Source or Header
|
1977-12-31
|
5KB
|
204 lines
/*
* global_memory.c V3.0
*
* ToolManager global memory management routines
*
* Copyright (C) 1990-97 Stefan Becker
*
* This source code is for educational purposes only. You may study it
* and copy ideas or algorithms from it for your own projects. It is
* not allowed to use any of the source codes (in full or in parts)
* in other programs. Especially it is not allowed to create variants
* of ToolManager or ToolManager-like programs from this source code.
*
*/
#ifdef DEBUG
/* Debugging versions of memory functions. These work with Mungwall */
/* Local data structures */
struct MemoryData {
struct MinNode md_Node;
ULONG md_Size;
/* Rest of memory block follows here */
};
/* Local data */
static struct MinList MemoryList;
static BOOL Initialized = FALSE;
/* Initialize memory managment */
#define DEBUGFUNCTION InitMemory
BOOL InitMemory(void)
{
/* Initialize list */
NewList((struct List *) &MemoryList);
/* Set flag */
Initialized = TRUE;
INFORMATION_LOG(LOG0(Memory tracking enabled))
return(TRUE);
}
/* Shut down memory management */
#undef DEBUGFUNCTION
#define DEBUGFUNCTION DeleteMemory
void DeleteMemory(void)
{
/* List empty? */
if ((Initialized == FALSE) || IsListEmpty((struct List *) &MemoryList)) {
INFORMATION_LOG(LOG0(All memory was released))
} else {
struct MemoryData *md;
ERROR_LOG(LOG0(The following memory has not been released))
while (md = (struct MemoryData *) RemHead((struct List *) &MemoryList)) {
ERROR_LOG(LOG2(Not released, "Block 0x%08lx Size %ld",
md + 1, md->md_Size))
FreeVector(md + 1);
}
}
/* Reset flag */
Initialized = FALSE;
}
/* Get memory (no size tracking) */
void *GetMemory(ULONG size)
{
return(GetVector(size));
}
/* Free memory (no size tracking) */
#undef DEBUGFUNCTION
#define DEBUGFUNCTION FreeMemory
void FreeMemory(void *ptr, ULONG size)
{
struct MemoryData *md = (struct MemoryData *) ptr - 1;
/* Check sizes */
if (size == (md->md_Size - sizeof(struct MemoryData))) {
MEMORY_LOG(LOG2(Arguments, "Block 0x%08lx Size %ld", ptr, size))
} else {
ERROR_LOG(LOG3(Error, "Block 0x%08lx Size %ld != Orig %ld",
ptr, size, md->md_Size))
}
/* Remove memory block */
Remove((struct Node *) md);
FreeMem(md, md->md_Size);
}
/* Get memory (with size tracking) */
#undef DEBUGFUNCTION
#define DEBUGFUNCTION GetVector
void *GetVector(ULONG size)
{
struct MemoryData *md;
/* Add size for our data structure */
size += sizeof(struct MemoryData);
/* Allocate memory, save size and move pointer to real mem. block */
if (md = AllocMem(size, MEMF_PUBLIC)) {
md->md_Size = size;
/* Add block to memory list */
AddTail((struct List *) &MemoryList, (struct Node *) md++);
}
MEMORY_LOG(LOG2(Result, "Block 0x%08lx Size %ld",
md, size - sizeof(struct MemoryData)))
/* Return pointer to memory block */
return(md);
}
/* Free memory (with size tracking) */
#undef DEBUGFUNCTION
#define DEBUGFUNCTION FreeVector
void FreeVector(void *ptr)
{
struct MemoryData *md = (struct MemoryData *) ptr - 1;
MEMORY_LOG(LOG2(Arguments, "Block 0x%08lx Size %ld",
ptr, md->md_Size - sizeof(struct MemoryData)))
/* Remove memory block */
Remove((struct Node *) md);
FreeMem(md, md->md_Size);
}
#else
/* The production code uses memory pools */
/* Local data structures */
struct Vector {
ULONG v_Size;
/* Rest of memory block follows here */
};
/* Local data */
static void *MemoryPool = NULL;
/* Initialize memory managment */
BOOL InitMemory(void)
{
/* Allocate memory pool */
return(MemoryPool = CreatePool(MEMF_PUBLIC, 8 * 1024, 6 * 1024));
}
/* Shut down memory management */
void DeleteMemory(void)
{
if (MemoryPool) {
DeletePool(MemoryPool);
MemoryPool = NULL;
}
}
/* Get memory (no size tracking) */
void *GetMemory(ULONG size)
{
return(AllocPooled(MemoryPool, size));
}
/* Free memory (no size tracking) */
void FreeMemory(void *ptr, ULONG size)
{
FreePooled(MemoryPool, ptr, size);
}
/* Get memory (with size tracking) */
void *GetVector(ULONG size)
{
struct Vector *v;
/* Add size for our data structure */
size += sizeof(struct Vector);
/* Allocate memory from pool, save size and move pointer to real mem. block */
if (v = AllocPooled(MemoryPool, size)) (v++)->v_Size = size;
/* Return pointer to memory block */
return(v);
}
/* Free memory (with size tracking) */
void FreeVector(void *ptr)
{
ULONG size = (--((struct Vector *) ptr))->v_Size;
FreePooled(MemoryPool, ptr, size);
}
#endif