Twiddling with allocation for 64-bit architectures
git-svn-id: http://picoc.googlecode.com/svn/trunk@378 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
5c86cfaf36
commit
3162c1a2bf
|
@ -546,7 +546,7 @@ void ExpressionInfixOperator(struct ParseState *Parser, struct ExpressionStack *
|
||||||
|
|
||||||
debugf("ExpressionInfixOperator()\n");
|
debugf("ExpressionInfixOperator()\n");
|
||||||
if (BottomValue == NULL || TopValue == NULL)
|
if (BottomValue == NULL || TopValue == NULL)
|
||||||
ProgramFail(Parser, "bad expression");
|
ProgramFail(Parser, "invalid expression");
|
||||||
|
|
||||||
if (Op == TokenLeftSquareBracket)
|
if (Op == TokenLeftSquareBracket)
|
||||||
{
|
{
|
||||||
|
|
29
heap.c
29
heap.c
|
@ -126,7 +126,7 @@ void *HeapAllocMem(int Size)
|
||||||
#else
|
#else
|
||||||
struct AllocNode *NewMem = NULL;
|
struct AllocNode *NewMem = NULL;
|
||||||
struct AllocNode **FreeNode;
|
struct AllocNode **FreeNode;
|
||||||
int AllocSize = MEM_ALIGN(Size) + sizeof(NewMem->Size);
|
int AllocSize = MEM_ALIGN(Size) + MEM_ALIGN(sizeof(NewMem->Size));
|
||||||
int Bucket;
|
int Bucket;
|
||||||
|
|
||||||
if (Size == 0)
|
if (Size == 0)
|
||||||
|
@ -140,7 +140,8 @@ void *HeapAllocMem(int Size)
|
||||||
|
|
||||||
Bucket = AllocSize >> 2;
|
Bucket = AllocSize >> 2;
|
||||||
if (Bucket < FREELIST_BUCKETS && FreeListBucket[Bucket] != NULL)
|
if (Bucket < FREELIST_BUCKETS && FreeListBucket[Bucket] != NULL)
|
||||||
{ /* try to allocate from a freelist bucket first */
|
{
|
||||||
|
/* try to allocate from a freelist bucket first */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("allocating %d(%d) from bucket", Size, AllocSize);
|
printf("allocating %d(%d) from bucket", Size, AllocSize);
|
||||||
#endif
|
#endif
|
||||||
|
@ -151,7 +152,8 @@ void *HeapAllocMem(int Size)
|
||||||
NewMem->Size = AllocSize;
|
NewMem->Size = AllocSize;
|
||||||
}
|
}
|
||||||
else if (FreeListBig != NULL)
|
else if (FreeListBig != NULL)
|
||||||
{ /* grab the first item from the "big" freelist we can fit in */
|
{
|
||||||
|
/* grab the first item from the "big" freelist we can fit in */
|
||||||
for (FreeNode = &FreeListBig; *FreeNode != NULL && (*FreeNode)->Size < AllocSize; FreeNode = &(*FreeNode)->NextFree)
|
for (FreeNode = &FreeListBig; *FreeNode != NULL && (*FreeNode)->Size < AllocSize; FreeNode = &(*FreeNode)->NextFree)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@ -159,8 +161,9 @@ void *HeapAllocMem(int Size)
|
||||||
{
|
{
|
||||||
assert((unsigned long)*FreeNode >= (unsigned long)&HeapMemory[0] && (unsigned char *)*FreeNode - &HeapMemory[0] < HEAP_SIZE);
|
assert((unsigned long)*FreeNode >= (unsigned long)&HeapMemory[0] && (unsigned char *)*FreeNode - &HeapMemory[0] < HEAP_SIZE);
|
||||||
assert((*FreeNode)->Size < HEAP_SIZE && (*FreeNode)->Size > 0);
|
assert((*FreeNode)->Size < HEAP_SIZE && (*FreeNode)->Size > 0);
|
||||||
if ((*FreeNode)->Size < Size + SPLIT_MEM_THRESHOLD)
|
if ((*FreeNode)->Size < AllocSize + SPLIT_MEM_THRESHOLD)
|
||||||
{ /* close in size - reduce fragmentation by not splitting */
|
{
|
||||||
|
/* close in size - reduce fragmentation by not splitting */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("allocating %d(%d) from freelist, no split (%d)", Size, AllocSize, (*FreeNode)->Size);
|
printf("allocating %d(%d) from freelist, no split (%d)", Size, AllocSize, (*FreeNode)->Size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -169,7 +172,8 @@ void *HeapAllocMem(int Size)
|
||||||
*FreeNode = NewMem->NextFree;
|
*FreeNode = NewMem->NextFree;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* split this big memory chunk */
|
{
|
||||||
|
/* split this big memory chunk */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("allocating %d(%d) from freelist, split chunk (%d)", Size, AllocSize, (*FreeNode)->Size);
|
printf("allocating %d(%d) from freelist, split chunk (%d)", Size, AllocSize, (*FreeNode)->Size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -182,7 +186,8 @@ void *HeapAllocMem(int Size)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NewMem == NULL)
|
if (NewMem == NULL)
|
||||||
{ /* couldn't allocate from a freelist - try to increase the size of the heap area */
|
{
|
||||||
|
/* couldn't allocate from a freelist - try to increase the size of the heap area */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("allocating %d(%d) at bottom of heap (0x%lx-0x%lx)", Size, AllocSize, (long)(HeapBottom - AllocSize), (long)HeapBottom);
|
printf("allocating %d(%d) at bottom of heap (0x%lx-0x%lx)", Size, AllocSize, (long)(HeapBottom - AllocSize), (long)HeapBottom);
|
||||||
#endif
|
#endif
|
||||||
|
@ -217,7 +222,8 @@ void HeapFreeMem(void *Mem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((void *)MemNode == HeapBottom)
|
if ((void *)MemNode == HeapBottom)
|
||||||
{ /* pop it off the bottom of the heap, reducing the heap size */
|
{
|
||||||
|
/* pop it off the bottom of the heap, reducing the heap size */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("freeing %d from bottom of heap\n", MemNode->Size);
|
printf("freeing %d from bottom of heap\n", MemNode->Size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -227,7 +233,8 @@ void HeapFreeMem(void *Mem)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (Bucket < FREELIST_BUCKETS)
|
else if (Bucket < FREELIST_BUCKETS)
|
||||||
{ /* we can fit it in a bucket */
|
{
|
||||||
|
/* we can fit it in a bucket */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("freeing %d to bucket\n", MemNode->Size);
|
printf("freeing %d to bucket\n", MemNode->Size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -236,7 +243,8 @@ void HeapFreeMem(void *Mem)
|
||||||
FreeListBucket[Bucket] = (struct AllocNode *)MemNode;
|
FreeListBucket[Bucket] = (struct AllocNode *)MemNode;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* put it in the big memory freelist */
|
{
|
||||||
|
/* put it in the big memory freelist */
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
printf("freeing %lx:%d to freelist\n", (unsigned long)Mem, MemNode->Size);
|
printf("freeing %lx:%d to freelist\n", (unsigned long)Mem, MemNode->Size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -249,3 +257,4 @@ void HeapFreeMem(void *Mem)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#define HEAP_SIZE 16384 /* default space for the heap and the stack */
|
#define HEAP_SIZE 16384 /* default space for the heap and the stack */
|
||||||
#endif
|
#endif
|
||||||
#define LARGE_INT_POWER_OF_TEN 1000000000 /* the largest power of ten which fits in an int on this architecture */
|
#define LARGE_INT_POWER_OF_TEN 1000000000 /* the largest power of ten which fits in an int on this architecture */
|
||||||
#define ARCH_ALIGN_WORDSIZE sizeof(int) /* memory alignment boundary on this architecture */
|
#define ARCH_ALIGN_WORDSIZE sizeof(void *) /* memory alignment boundary on this architecture */
|
||||||
|
|
||||||
#define GLOBAL_TABLE_SIZE 97 /* global variable table */
|
#define GLOBAL_TABLE_SIZE 97 /* global variable table */
|
||||||
#define STRING_TABLE_SIZE 97 /* shared string table size */
|
#define STRING_TABLE_SIZE 97 /* shared string table size */
|
||||||
|
|
Loading…
Reference in a new issue