ooRexx
4.2.0-source
About: ooRexx (Open Object Rexx) is a free implementation of Object Rexx. Object Rexx is an enhancement of the classic Rexx interpreter; a full-featured programming language with a human-oriented syntax. Fossies Dox: ooRexx-4.2.0-source.tar.gz ("inofficial" and yet experimental doxygen-generated source code documentation) 
|
Go to the documentation of this file. 45 #ifndef Included_MemorySegment 46 #define Included_MemorySegment 52 #define MemorySegmentOverhead (sizeof(MemorySegmentHeader)) 53 #define MemorySegmentPoolOverhead (sizeof(MemorySegmentPoolHeader)) 57 #define SegmentSize (256*1024*2) 59 #define LargeBlockThreshold 8192 62 #define SegmentSize (256*1024) 64 #define LargeBlockThreshold 4096 67 #define MinimumSegmentSize (SegmentSize/2) 69 #define MinimumSegmentDeadSpace (MinimumSegmentSize - MemorySegmentOverhead) 71 #define LargeSegmentSize (SegmentSize * 4) 73 #define SegmentDeadSpace (SegmentSize - MemorySegmentOverhead) 75 #define RecoverSegmentSize ((SegmentSize/2) - MemorySegmentOverhead) 77 #define LargeSegmentDeadSpace (LargeSegmentSize - MemorySegmentOverhead) 79 #define InitialNormalSegmentSpace ((LargeSegmentSize * 8) - MemorySegmentOverhead) 81 #define LargestNormalSegmentSize (LargeObjectMinSize - (1024 * 1024) - MemorySegmentOverhead) 87 #define MemoryThrashingThreshold 4 91 #define LengthToDeadPool(l) ((l)/ObjectGrain) 94 #define DeadPoolToLength(d) ((d)*ObjectGrain) 99 #define FirstDeadPool (LengthToDeadPool(MinimumObjectSize) - 1) 101 #define LargestSubpool 512 103 #define LastDeadPool LengthToDeadPool(LargestSubpool) 106 #define DeadPools LastDeadPool + 1 109 #define NormalMemoryExpansionThreshold .30 111 #define NormalMemoryContractionThreshold .70 115 #define MaxDeadObjectSpace 1000000 151 inline void *
operator new(
size_t size,
void *segment) {
return segment; }
152 inline void operator delete(
void *) { }
153 inline void operator delete(
void *,
void *) { }
201 inline bool isLastBlock(
char *addr,
size_t length) {
return (addr + length) ==
end(); }
210 void dump(
const char *owner,
size_t counter, FILE *keyfile, FILE *dumpfile);
240 this->
name = setName;
252 inline void *
operator new(
size_t size,
void *segment) {
return segment; }
253 inline void operator delete(
void * size) { }
254 inline void operator delete(
void * size,
void *segment) { }
289 return segment->
next;
298 while (segment != NULL) {
302 segment =
next(segment);
339 bool newSegment(
size_t requestLength,
size_t minimumLength);
464 if (newObject != NULL) {
465 size_t deadLength = realLength - allocationLength;
535 ((
RexxObject *)
object)->setObjectSize(allocationLength);
565 if (largeObject != NULL) {
MemorySegment(size_t segSize)
void dumpSegments(FILE *keyfile, FILE *dumpfile)
void insertSegment(MemorySegment *segment)
RexxObject * handleAllocationFailure(size_t allocationLength)
void insertBefore(MemorySegment *newSegment)
void addSegments(size_t requiredSpace)
virtual MemorySegment * donateSegment(size_t allocationLength)
void addSingle(DeadObject *obj)
DeadObject * getFirstSingle()
size_t mapLengthToDeadPool(size_t length)
void shrink(size_t delta)
friend class OldSegmentSet
size_t calculateSegmentAllocation(size_t n)
virtual ~OldSpaceSegmentSet()
void combine(MemorySegment *nextSegment)
bool isAdjacentTo(MemorySegment *seg)
virtual void addDeadObject(DeadObject *object)
#define LargeAllocationUnit
virtual ~NormalSegmentSet()
size_t lastUsedSubpool[((512)/ObjectGrain)+1+1]
virtual void prepareForSweep()
MemorySegment * newSegment(size_t requestLength, size_t minLength)
virtual MemorySegment * allocateSegment(size_t requestLength, size_t minimumLength)
DeadObject * findBestFit(size_t length)
void expandOrCollect(size_t allocationLength)
void activateEmptySegments()
RexxObject * splitDeadObject(DeadObject *object, size_t allocationLength, size_t splitMinimum)
void add(MemorySegment *segment)
bool isInSegmentSet(RexxObject *object)
RexxObject * allocateObject(size_t allocationLength)
void validateObject(size_t bytes)
virtual void collectEmptySegments()
MemorySegmentSet(RexxMemory *memObject, SegmentSetID id, const char *setName)
RexxObject * findObject(size_t allocationLength)
void expandSegmentSet(size_t allocationLength)
#define MemorySegmentOverhead
virtual void addDeadObject(DeadObject *object)
virtual size_t suggestMemoryContraction()
virtual void addDeadObject(DeadObject *object)
MemorySegment * largestEmptySegment()
DeadObjectPool subpools[((512)/ObjectGrain)+1]
virtual size_t suggestMemoryExpansion()
size_t roundSegmentBoundary(size_t n)
MemorySegment * largestActiveSegment()
virtual MemorySegment * allocateSegment(size_t requestLength, size_t minimumLength)
virtual void completeSweepOperation()
bool newSegment(size_t requestLength, size_t minimumLength)
virtual ~LargeSegmentSet()
MemorySegment * splitSegment(size_t allocationLength)
DeadObject * createDeadObject()
bool isInSegment(RexxObject *object)
virtual size_t suggestMemoryExpansion()
void mergeSegments(size_t allocationLength)
DeadObject * firstObject()
virtual void dumpMemoryProfile(FILE *outfile)
virtual ~MemorySegmentSet()
MemorySegment emptySegments
void markOldSpaceObjects()
RexxObject * splitNormalDeadObject(DeadObject *object, size_t allocationLength, size_t deadLength)
RexxObject * findObject(size_t allocationLength)
virtual size_t suggestMemoryContraction()
virtual void dumpMemoryProfile(FILE *outfile)
RexxObject * findLargeDeadObject(size_t allocationLength)
virtual DeadObject * donateObject(size_t allocationLength)
#define MinimumObjectSize
void gatherObjectStats(MemoryStats *memStats, SegmentStats *stats)
MemorySegment * getSegment(size_t requestLength, size_t minimumLength)
MemorySegment * recoverSegment
DeadObject * firstDeadObject()
DeadObject * lastDeadObject()
virtual void addDeadObject(DeadObject *object)
void combineEmptySegments(MemorySegment *front, MemorySegment *back)
void completeSweepOperation()
void add(DeadObject *obj)
void releaseSegment(MemorySegment *segment)
virtual void prepareForSweep()
MemorySegment * next(MemorySegment *segment)
RexxObject * findObject(size_t allocationLength)
bool isLastBlock(char *addr, size_t length)
bool isFirstBlock(char *addr)
void removeSegmentAndStorage(MemorySegment *segment)
RexxObject * allocateObject(size_t allocationLength)
RexxObject * allocateObject(size_t allocationLength)
void dump(const char *owner, size_t counter, FILE *keyfile, FILE *dumpfile)
virtual DeadObject * donateObject(size_t allocationLength)
void completeSweepOperation()
void checkObjectOverlap(DeadObject *obj)
virtual DeadObject * donateObject(size_t allocationLength)
RexxObject * handleAllocationFailure(size_t allocationLength)
#define NormalMemoryExpansionThreshold
virtual void prepareForSweep()
void gatherStats(MemoryStats *memStats, SegmentStats *stats)
static void logicError(const char *desc)
void insertAfter(MemorySegment *newSegment)
void removeSegment(MemorySegment *segment)
MemorySegment * findEmptySegment(size_t allocationLength)
size_t recommendedMemorySize()
size_t recommendedMaximumMemorySize()
void releaseEmptySegments(size_t releaseSize)
virtual void dumpMemoryProfile(FILE *outfile)
void addSegment(MemorySegment *segment, bool createDeadObject=1)
#define LengthToDeadPool(l)
DeadObject * findFit(size_t length)
float freeMemoryPercentage()
#define NormalMemoryContractionThreshold