📄 memalloc.c
字号:
}
/************************************/
/* EnvMemRequests: C access routine */
/* for the mem-requests command. */
/************************************/
globle long int EnvMemRequests(
void *theEnv)
{
return(MemoryData(theEnv)->MemoryCalls);
}
/***************************************/
/* UpdateMemoryUsed: Allows the amount */
/* of memory used to be updated. */
/***************************************/
globle long int UpdateMemoryUsed(
void *theEnv,
long int value)
{
MemoryData(theEnv)->MemoryAmount += value;
return(MemoryData(theEnv)->MemoryAmount);
}
/*******************************************/
/* UpdateMemoryRequests: Allows the number */
/* of memory requests to be updated. */
/*******************************************/
globle long int UpdateMemoryRequests(
void *theEnv,
long int value)
{
MemoryData(theEnv)->MemoryCalls += value;
return(MemoryData(theEnv)->MemoryCalls);
}
/***********************************/
/* EnvReleaseMem: C access routine */
/* for the release-mem command. */
/***********************************/
globle long int EnvReleaseMem(
void *theEnv,
long int maximum,
int printMessage)
{
struct memoryPtr *tmpPtr, *memPtr;
int i;
long int returns = 0;
long int amount = 0;
if (printMessage == TRUE)
{ EnvPrintRouter(theEnv,WDIALOG,"\n*** DEALLOCATING MEMORY ***\n"); }
for (i = (MEM_TABLE_SIZE - 1) ; i >= (int) sizeof(char *) ; i--)
{
YieldTime(theEnv);
memPtr = MemoryData(theEnv)->MemoryTable[i];
while (memPtr != NULL)
{
tmpPtr = memPtr->next;
genfree(theEnv,(void *) memPtr,(unsigned) i);
memPtr = tmpPtr;
amount += i;
returns++;
if ((returns % 100) == 0)
{ YieldTime(theEnv); }
}
MemoryData(theEnv)->MemoryTable[i] = NULL;
if ((amount > maximum) && (maximum > 0))
{
if (printMessage == TRUE)
{ EnvPrintRouter(theEnv,WDIALOG,"*** MEMORY DEALLOCATED ***\n"); }
return(amount);
}
}
if (printMessage == TRUE)
{ EnvPrintRouter(theEnv,WDIALOG,"*** MEMORY DEALLOCATED ***\n"); }
return(amount);
}
/*****************************************************/
/* gm1: Allocates memory and sets all bytes to zero. */
/*****************************************************/
globle void *gm1(
void *theEnv,
int size)
{
struct memoryPtr *memPtr;
char *tmpPtr;
int i;
if (size < (long) sizeof(char *)) size = sizeof(char *);
if (size >= MEM_TABLE_SIZE)
{
tmpPtr = (char *) genalloc(theEnv,(unsigned) size);
for (i = 0 ; i < size ; i++)
{ tmpPtr[i] = '\0'; }
return((void *) tmpPtr);
}
memPtr = (struct memoryPtr *) MemoryData(theEnv)->MemoryTable[size];
if (memPtr == NULL)
{
tmpPtr = (char *) genalloc(theEnv,(unsigned) size);
for (i = 0 ; i < size ; i++)
{ tmpPtr[i] = '\0'; }
return((void *) tmpPtr);
}
MemoryData(theEnv)->MemoryTable[size] = memPtr->next;
tmpPtr = (char *) memPtr;
for (i = 0 ; i < size ; i++)
{ tmpPtr[i] = '\0'; }
return ((void *) tmpPtr);
}
/*****************************************************/
/* gm2: Allocates memory and does not initialize it. */
/*****************************************************/
globle void *gm2(
void *theEnv,
unsigned int size)
{
struct memoryPtr *memPtr;
if (size < sizeof(char *)) size = sizeof(char *);
if (size >= MEM_TABLE_SIZE) return(genalloc(theEnv,(unsigned) size));
memPtr = (struct memoryPtr *) MemoryData(theEnv)->MemoryTable[size];
if (memPtr == NULL)
{
return(genalloc(theEnv,(unsigned) size));
}
MemoryData(theEnv)->MemoryTable[size] = memPtr->next;
return ((void *) memPtr);
}
/*****************************************************/
/* gm3: Allocates memory and does not initialize it. */
/*****************************************************/
globle void *gm3(
void *theEnv,
long size)
{
struct memoryPtr *memPtr;
if (size < (long) sizeof(char *)) size = sizeof(char *);
if (size >= MEM_TABLE_SIZE) return(genlongalloc(theEnv,(unsigned long) size));
memPtr = (struct memoryPtr *) MemoryData(theEnv)->MemoryTable[(int) size];
if (memPtr == NULL)
{
return(genalloc(theEnv,(unsigned int) size));
}
MemoryData(theEnv)->MemoryTable[(int) size] = memPtr->next;
return ((void *) memPtr);
}
/****************************************/
/* rm: Returns a block of memory to the */
/* maintained pool of free memory. */
/****************************************/
globle int rm(
void *theEnv,
void *str,
unsigned size)
{
struct memoryPtr *memPtr;
if (size == 0)
{
SystemError(theEnv,"MEMORY",1);
EnvExitRouter(theEnv,EXIT_FAILURE);
}
if (size < sizeof(char *)) size = sizeof(char *);
if (size >= MEM_TABLE_SIZE) return(genfree(theEnv,(void *) str,(unsigned) size));
memPtr = (struct memoryPtr *) str;
memPtr->next = MemoryData(theEnv)->MemoryTable[size];
MemoryData(theEnv)->MemoryTable[size] = memPtr;
return(1);
}
/********************************************/
/* rm3: Returns a block of memory to the */
/* maintained pool of free memory that's */
/* size is indicated with a long integer. */
/********************************************/
globle int rm3(
void *theEnv,
void *str,
long size)
{
struct memoryPtr *memPtr;
if (size == 0)
{
SystemError(theEnv,"MEMORY",1);
EnvExitRouter(theEnv,EXIT_FAILURE);
}
if (size < (long) sizeof(char *)) size = sizeof(char *);
if (size >= MEM_TABLE_SIZE) return(genlongfree(theEnv,(void *) str,(unsigned long) size));
memPtr = (struct memoryPtr *) str;
memPtr->next = MemoryData(theEnv)->MemoryTable[(int) size];
MemoryData(theEnv)->MemoryTable[(int) size] = memPtr;
return(1);
}
/***************************************************/
/* PoolSize: Returns number of bytes in free pool. */
/***************************************************/
globle unsigned long PoolSize(
void *theEnv)
{
register int i;
struct memoryPtr *memPtr;
unsigned long cnt = 0;
for (i = sizeof(char *) ; i < MEM_TABLE_SIZE ; i++)
{
memPtr = MemoryData(theEnv)->MemoryTable[i];
while (memPtr != NULL)
{
cnt += (unsigned long) i;
memPtr = memPtr->next;
}
}
return(cnt);
}
/***************************************************************/
/* ActualPoolSize : Returns number of bytes DOS requires to */
/* store the free pool. This routine is functionally */
/* equivalent to pool_size on anything other than the IBM-PC */
/***************************************************************/
globle unsigned long ActualPoolSize(
void *theEnv)
{
#if IBM_TBC
register int i;
struct memoryPtr *memPtr;
unsigned long cnt = 0;
for (i = sizeof(char *) ; i < MEM_TABLE_SIZE ; i++)
{
memPtr = MemoryData(theEnv)->MemoryTable[i];
while (memPtr != NULL)
{
/*==============================================================*/
/* For a block of size n, the Turbo-C Library routines require */
/* a header of size 8 bytes and further require that all memory */
/* allotments be paragraph (16-bytes) aligned. */
/*==============================================================*/
cnt += (((unsigned long) i) + 19L) & 0xfffffff0L;
memPtr = memPtr->next;
}
}
return(cnt);
#else
return(PoolSize(theEnv));
#endif
}
/********************************************/
/* EnvSetConserveMemory: Allows the setting */
/* of the memory conservation flag. */
/********************************************/
globle intBool EnvSetConserveMemory(
void *theEnv,
intBool value)
{
int ov;
ov = MemoryData(theEnv)->ConserveMemory;
MemoryData(theEnv)->ConserveMemory = value;
return(ov);
}
/*******************************************/
/* EnvGetConserveMemory: Returns the value */
/* of the memory conservation flag. */
/*******************************************/
globle intBool EnvGetConserveMemory(
void *theEnv)
{
return(MemoryData(theEnv)->ConserveMemory);
}
/**************************/
/* genmemcpy: */
/**************************/
globle void genmemcpy(
char *dst,
char *src,
unsigned long size)
{
unsigned long i;
for (i = 0L ; i < size ; i++)
dst[i] = src[i];
}
/**************************/
/* BLOCK MEMORY FUNCTIONS */
/**************************/
#if BLOCK_MEMORY
/***************************************************/
/* InitializeBlockMemory: Initializes block memory */
/* management and allocates the first block. */
/***************************************************/
static int InitializeBlockMemory(
void *theEnv,
unsigned int requestSize)
{
struct chunkInfo *chunkPtr;
unsigned int initialBlockSize, usableBlockSize;
/*===========================================*/
/* The block memory routines depend upon the */
/* size of a character being 1 byte. */
/*===========================================*/
if (sizeof(char) != 1)
{
fprintf(stdout, "Size of character data is not 1\n");
fprintf(stdout, "Memory allocation functions may not work\n");
return(0);
}
MemoryData(theEnv)->ChunkInfoSize = sizeof(struct chunkInfo);
MemoryData(theEnv)->ChunkInfoSize = (int) ((((MemoryData(theEnv)->ChunkInfoSize - 1) / STRICT_ALIGN_SIZE) + 1) * STRICT_ALIGN_SIZE);
MemoryData(theEnv)->BlockInfoSize = sizeof(struct blockInfo);
MemoryData(theEnv)->BlockInfoSize = (int) ((((MemoryData(theEnv)->BlockInfoSize - 1) / STRICT_ALIGN_SIZE) + 1) * STRICT_ALIGN_SIZE);
initialBlockSize = (INITBLOCKSIZE > requestSize ? INITBLOCKSIZE : requestSize);
initialBlockSize += MemoryData(theEnv)->ChunkInfoSize * 2 + MemoryData(theEnv)->BlockInfoSize;
initialBlockSize = (((initialBlockSize - 1) / STRICT_ALIGN_SIZE) + 1) * STRICT_ALIGN_SIZE;
usableBlockSize = initialBlockSize - (2 * MemoryData(theEnv)->ChunkInfoSize) - MemoryData(theEnv)->BlockInfoSize;
/* make sure we get a buffer big enough to be usable */
if ((requestSize < INITBLOCKSIZE) &&
(usableBlockSize <= requestSize + MemoryData(theEnv)->ChunkInfoSize))
{
initialBlockSize = requestSize + MemoryData(theEnv)->ChunkInfoSize * 2 + MemoryData(theEnv)->BlockInfoSize;
initialBlockSize = (((initialBlockSize - 1) / STRICT_ALIGN_SIZE) + 1) * STRICT_ALIGN_SIZE;
usableBlockSize = initialBlockSize - (2 * MemoryData(theEnv)->ChunkInfoSize) - MemoryData(theEnv)->BlockInfoSize;
}
MemoryData(theEnv)->TopMemoryBlock = (struct blockInfo *) malloc((STD_SIZE) initialBlockSize);
if (MemoryData(theEnv)->TopMemoryBlock == NULL)
{
fprintf(stdout, "Unable to allocate initial memory pool\n");
return(0);
}
MemoryData(theEnv)->TopMemoryBlock->nextBlock = NULL;
MemoryData(theEnv)->TopMemoryBlock->prevBlock = NULL;
MemoryData(theEnv)->TopMemoryBlock->nextFree = (struct chunkInfo *) (((char *) MemoryData(theEnv)->TopMemoryBlock) + MemoryData(theEnv)->BlockInfoSize);
MemoryData(theEnv)->TopMemoryBlock->size = (long) usableBlockSize;
chunkPtr = (struct chunkInfo *) (((char *) MemoryData(theEnv)->TopMemoryBlock) + MemoryData(theEnv)->BlockInfoSize + MemoryData(theEnv)->ChunkInfoSize + usableBlockSize);
chunkPtr->nextFree = NULL;
chunkPtr->lastFree = NULL;
chunkPtr->prevChunk = MemoryData(theEnv)->TopMemoryBlock->nextFree;
chunkPtr->size = 0;
MemoryData(theEnv)->TopMemoryBlock->nextFree->nextFree = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -