// Source code example for "A Practical Introduction // to Data Structures and Algorithm Analysis" // by Clifford A. Shaffer, Prentice Hall, 1998. // Copyright 1998 by Clifford A. Shaffer // A basic memory manager implementation class MemManImpl implements MemManager{ private static final int STARTTAG = 0; // Start tag offset private static final int FULLSIZE = 1; // Size field offset private static final int USERSIZE = 2; // User size offset private static final int LPTR = 2; // Left freelist pointer private static final int RPTR = 3; // Right freelist pointer private static final int DATAPOS = 3; // Start of data private static final int FREE = -1; // Tag value private static final int RESERVED = -2; // Tag value private static final int ENDSIZE = 4; // Size field offset private static final int FREEENDTAG = 5; // Tag field offset private static final int RESENDTAG = 3; // Tag field offset private static final int MINEXTRA = -2; // Extra space needed private static final int FREEOVERHEAD = 6; // Number free fields private static final int RESOVERHEAD = 4; // Number of res fields private static final int MINREQUEST = 2; // Smallest data request int[] mempool; // The data space MemHandle freelist; // Free memory access MemManImpl(int size) { // Constructor mempool = new int[size]; // Allocate space freelist = new MemHandle(0); // Start of freelist mempool[STARTTAG] = mempool[size-1] = FREE; mempool[FULLSIZE] = mempool[size-2] = size - FREEOVERHEAD; mempool[LPTR] = mempool[RPTR] = 0; // Circ doubly-linked list } public int[] getValue(MemHandle h) { // Return data for h int startpos = h.getPos(); int length = mempool[startpos + USERSIZE]; int startdata = startpos + DATAPOS; int[] stuff = new int[length]; for (int i=0; i= (length + MINEXTRA)) return curr; else { curr = mempool[curr + RPTR]; if (curr == freestart) return -1; // No block available } } public MemHandle request(int[] info) { int datasize; if (info.length < MINREQUEST) // Minimum necessary for datasize = MINREQUEST; // a sustainable block else datasize = info.length; int start= pickFreeBlock(info.length); if (start == -1) return null; // No block is big enough if (mempool[start + FULLSIZE] > (datasize + RESOVERHEAD)) { // Fix up the remaining free space int oldsize = mempool[start+FULLSIZE]-datasize-RESOVERHEAD; mempool[start + oldsize + FREEENDTAG] = FREE; mempool[start + oldsize + ENDSIZE] = oldsize; mempool[start + FULLSIZE] = oldsize; // Now, fix up the new block int newstart = start + mempool[start+FULLSIZE] + FREEOVERHEAD; mempool[newstart+STARTTAG] = RESERVED; mempool[newstart+FULLSIZE] = datasize; mempool[newstart+USERSIZE] = info.length; mempool[newstart+datasize+RESENDTAG] = RESERVED; for (int i=0; i