diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java
index b10cbf4500c..de8685ab20d 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/BTreeTests.java
@@ -34,16 +34,6 @@ import org.eclipse.core.runtime.CoreException;
*
*/
public class BTreeTests extends BaseTestCase {
-
- /**
- * Workaround: If the page table size of the database is too small,
- * there will be frequent page ins and page outs. This trips a bug
- * in FileChannelImpl.map0() which causes an IOException. If the
- * page table size is large enough so that page outs are infrequent,
- * the problem does not occur.
- */
- static final int PAGE_TABLE_SIZE = 10 * 1024 * 1024 / Database.CHUNK_SIZE; // 10 MB
-
protected File dbFile;
protected Database db;
protected BTree btree;
@@ -60,7 +50,7 @@ public class BTreeTests extends BaseTestCase {
// and invoke it multiple times per Junit test
protected void init(int degree) throws Exception {
dbFile = File.createTempFile("pdomtest", "db");
- db = new Database(dbFile, PAGE_TABLE_SIZE);
+ db = new Database(dbFile);
rootRecord = Database.DATA_AREA;
comparator = new BTMockRecordComparator();
btree = new BTree(db, rootRecord, degree, comparator);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Chunk.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Chunk.java
index 4e9b93d2560..76d509c6b5d 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Chunk.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Chunk.java
@@ -34,16 +34,6 @@ public class Chunk {
private Database db;
int index;
- /**
- * The index of this Chunk within the page table.
- */
- int pageTableIndex;
-
- /**
- * This flag is true if this Chunk has been referenced recently.
- */
- boolean referenceFlag;
-
Chunk(RandomAccessFile file, int offset) throws CoreException {
try {
index = offset / Database.CHUNK_SIZE;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java
index 531d5275866..52fc230bd6b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java
@@ -36,11 +36,6 @@ import org.eclipse.core.runtime.Status;
* mapping chunk index to chunk address is maintained. Chunk structure exists only conceptually -
* its not a structure that appears in the file.
*
- * Chunks are paged in one at a time as they are accessed. Frequently used
- * chunks remain in memory while infrequently used chunks are paged out to
- * to the file. The database uses the CLOCK algorithm to determine which
- * chunk to evict from the page table on a cache miss.
- *
* ===== The first chunk is used by Database itself for house-keeping purposes and has structure
*
* offset content
@@ -66,37 +61,8 @@ public class Database {
private final File location;
private final RandomAccessFile file;
-
- /**
- * Table of Chunks allocated by the Database.
- */
Chunk[] toc;
- /**
- * Table of actively used (paged-in) Chunks.
- */
- int[] pageTable;
-
- /**
- * The position where the next page in or page out will occur.
- */
- int pageTableIndex;
-
- /**
- * Indicates whether all slots in the page table have been allocated.
- */
- boolean pageTableIsFull;
-
- /**
- * Number of times a request for a Chunk was served from the cache.
- */
- long cacheHits;
-
- /**
- * Number of times a request for a Chunk needed to be paged in.
- */
- long cacheMisses;
-
private long malloced;
private long freed;
@@ -111,17 +77,8 @@ public class Database {
public static final int DATA_AREA = CHUNK_SIZE / MIN_SIZE * INT_SIZE + INT_SIZE;
public static final int MAX_SIZE = CHUNK_SIZE - 4; // Room for overhead
-
- /**
- * The initial number of slots in the page table.
- */
- public static final int DEFAULT_PAGE_TABLE_SIZE = 1 * 1024 * 1024 / CHUNK_SIZE;
-
+
public Database(File location) throws CoreException {
- this(location, DEFAULT_PAGE_TABLE_SIZE);
- }
-
- public Database(File location, int pageTableSize) throws CoreException {
try {
this.location = location;
this.file = new RandomAccessFile(location, "rw"); //$NON-NLS-1$
@@ -136,7 +93,6 @@ public class Database {
toc = new Chunk[(int)nChunks];
toc[0] = new Chunk(file, 0);
- pageTable = new int[pageTableSize];
} catch (IOException e) {
throw new CoreException(new DBStatus(e));
}
@@ -170,9 +126,6 @@ public class Database {
}
}
malloced = freed = 0;
-
- // Clear the page table
- resizePageTable(pageTable.length);
}
/**
@@ -241,13 +194,9 @@ public class Database {
int index = offset / CHUNK_SIZE;
Chunk chunk = toc[index];
if (chunk == null) {
- cacheMisses++;
- chunk = pageIn(offset);
- }
- else {
- cacheHits++;
- chunk.referenceFlag = true;
+ chunk = toc[index] = new Chunk(file, index * CHUNK_SIZE);
}
+
return chunk;
}
@@ -305,11 +254,6 @@ public class Database {
return freeblock + 4;
}
- /**
- * Extends the database by one chunk.
- * @return The index of the new chunk.
- * @throws CoreException
- */
private int createChunk() throws CoreException {
try {
Chunk[] oldtoc = toc;
@@ -319,7 +263,7 @@ public class Database {
file.write(new byte[CHUNK_SIZE]);
toc = new Chunk[n + 1];
System.arraycopy(oldtoc, 0, toc, 0, n);
- getChunk(offset);
+ toc[n] = new Chunk(file, offset);
return n;
} catch (IOException e) {
throw new CoreException(new DBStatus(e));
@@ -486,101 +430,4 @@ public class Database {
public File getLocation() {
return location;
}
-
- /**
- * Clears the page table and changes it to have size
number
- * of slots.
- * @param size The number of slots the page table should have.
- */
- public void resizePageTable(int size) {
- // Page out everything in the chunk/page tables.
- pageTable = new int[size];
- for (int i = 1; i < toc.length; i++) {
- toc[i] = null;
- }
-
- pageTableIndex = 0;
- pageTableIsFull = false;
- cacheHits = 0;
- cacheMisses = 0;
- }
-
- /**
- * Returns the number of cache hits since the page table was created.
- * @return The number of cache hits since the page table was created.
- */
- public long getCacheHits() {
- return cacheHits;
- }
-
- /**
- * Returns the number of cache misses since the page table was created.
- * @return The number of cache misses since the page table was created.
- */
- public long getCacheMisses() {
- return cacheMisses;
- }
-
- /**
- * Adds the chunk which contains the given given offset to the page table.
- * This method will evict chunks from the page table as necessary to page
- * in the requested chunk.
- *
- * @param offset The database offset that will be accessed.
- * @return The chunk which contains the given offset.
- * @throws CoreException
- */
- private Chunk pageIn(int offset) throws CoreException {
- int index = offset / CHUNK_SIZE;
- if (toc[index] != null) {
- return toc[index];
- }
-
- Chunk chunk = new Chunk(file, index * CHUNK_SIZE);
- toc[index] = chunk;
-
- if (pageTableIsFull) {
- evictChunk();
- chunk.pageTableIndex = pageTableIndex;
- pageTable[pageTableIndex] = index;
- }
- else {
- chunk.pageTableIndex = pageTableIndex;
- pageTable[pageTableIndex] = index;
-
- pageTableIndex++;
- if (pageTableIndex == pageTable.length) {
- pageTableIndex = 0;
- pageTableIsFull = true;
- }
- }
- return chunk;
- }
-
- /**
- * Evicts a chunk from the page table and the chunk table.
- * After this method returns, pageTableIndex
will contain
- * the index of the evicted chunk within the page table.
- */
- private void evictChunk() {
- /*
- * Use the CLOCK algorithm to determine which chunk to evict.
- * i.e., if the chunk in the current slot of the page table has been
- * recently referenced (i.e. the reference flag is set), unset the
- * reference flag and move to the next slot. Otherwise, evict the
- * chunk in the current slot.
- */
- while (true) {
- int chunkIndex = pageTable[pageTableIndex];
- Chunk chunk = toc[chunkIndex];
- if (chunk.referenceFlag) {
- chunk.referenceFlag = false;
- pageTableIndex = (pageTableIndex + 1) % pageTable.length;
- } else {
- toc[chunkIndex] = null;
- pageTable[pageTableIndex] = 0;
- return;
- }
- }
- }
}