Mercurial > hg > blitz_condensed
diff src/org/dancres/blitz/entry/ci/BitCacheLines.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/dancres/blitz/entry/ci/BitCacheLines.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,100 @@ +package org.dancres.blitz.entry.ci; + +import com.go.trove.util.IntHashMap; + +import org.dancres.blitz.entry.EntrySleeve; + +import org.dancres.struct.BitIndex; + +/** + Maintains a set of cache lines (key'd by hashcode) for a particular + field of one type of Entry. + */ +class BitCacheLines { + private IntHashMap theHashCodes = new IntHashMap(); + private int theOffset; + private String theName; + + private int theSize; + + BitCacheLines(int anOffset, String aName, int aSize) { + theOffset = anOffset; + theName = aName; + theSize = aSize; + } + + String getName() { + return theName; + } + + BitIndex getHits(int aHashcode) { + BitCacheLine myEntries = getLine(aHashcode, false); + + if (myEntries == null) + return null; + + return myEntries.getSlots(); + } + + /** + @return the number of entries under a particular hashcode + */ + int getSize(int aHashcode) { + BitCacheLine myEntries = getLine(aHashcode, false); + + if (myEntries == null) + return 0; + + return myEntries.getSize(); + } + + /** + @return the number of different hashcodes we know about + */ + int getSize() { + synchronized(theHashCodes) { + return theHashCodes.size(); + } + } + + void insert(EntrySleeve aSleeve, int aSlot) { + int myKey = getKey(aSleeve); + + synchronized(theHashCodes) { + BitCacheLine myEntries = getLine(myKey, true); + myEntries.insert(aSleeve, aSlot); + } + } + + void remove(EntrySleeve aSleeve, int aSlot) { + int myKey = getKey(aSleeve); + + synchronized (theHashCodes) { + BitCacheLine myEntries = getLine(myKey, false); + + myEntries.remove(aSleeve, aSlot); + + if (myEntries.getSize() == 0) + theHashCodes.remove(myKey); + } + } + + private int getKey(EntrySleeve aSleeve) { + int myHash = aSleeve.getHashCodeForField(theOffset); + + return myHash; + } + + private synchronized BitCacheLine getLine(int aKey, boolean doCreate) { + BitCacheLine myEntries; + + myEntries = (BitCacheLine) theHashCodes.get(aKey); + + if ((myEntries == null) && doCreate) { + myEntries = new BitCacheLine(theSize); + theHashCodes.put(aKey, myEntries); + } + + return myEntries; + } +}