LongMap(int size,int idSize,int foffsetSize) throws FileNotFoundException, IOException { super(size,idSize,foffsetSize,foffsetSize + 4 + 1 + idSize + foffsetSize); referenceList = new NumberList(ID_SIZE); }
long addNumber(long startOffset,long number) throws IOException { int slot; byte[] block = getBlock(startOffset); for (slot=0;slot<NUMBERS_IN_BLOCK;slot++) { long el = readNumber(block,slot); if (el == 0L) { writeNumber(startOffset,block,slot,number); return startOffset; } if (el == number) { // number is already in the list return startOffset; // do nothing } } long nextBlock = addBlock(); // create next blok block = getBlock(nextBlock); writeNumber(nextBlock,block,slot,startOffset); // put next block in front of old block writeNumber(nextBlock,block,0,number); // write number to first position in the new block return nextBlock; }
NumberList(long dumpFileSize) throws IOException { this(bytes(dumpFileSize)); }
long addFirstNumber(long number1,long number2) throws IOException { long blockOffset = addBlock(); byte[] block = getBlock(blockOffset); writeNumber(blockOffset,block,0,number1); writeNumber(blockOffset,block,1,number2); return blockOffset; }
long getFirstNumber(long startOffset) throws IOException { byte[] block = getBlock(startOffset); return readNumber(block,0); }
private long readNumber(byte[] block,int slot) { int offset = slot*numberSize; long el = 0; // for (int i=0;i<numberSize;i++) { // el <<= 8; // el |= ((int)block[offset+i]) & 0xFF; // } if (numberSize == 4) { return ((long)getInt(block,offset)) & 0xFFFFFFFFL; } else if (numberSize == 8) { return getLong(block,offset); } return el; }
void putFirst(long startOffset,long number) throws IOException { int slot; long offset = startOffset; long movedNumber = 0; for(;;) { byte[] block = getBlock(offset); for (slot=0;slot<NUMBERS_IN_BLOCK;slot++) { long el = readNumber(block,slot); if (offset == startOffset && slot == 0) { // first block if (number == el) { // already first element return; } movedNumber = el; writeNumber(offset,block,slot,number); } else if (el == 0L) { // end of the block, move to next one break; } else if (el == number) { // number is already in the list writeNumber(offset,block,slot,movedNumber); // replace number and return return; } } offset = getOffsetToNextBlock(block); if (offset == 0L) { System.out.println("Error - number not found at end"); return; } } }
List<Long> getNumbers(long startOffset) throws IOException { int slot; List<Long> numbers = new ArrayList<Long>(); for(;;) { byte[] block = getBlock(startOffset); for (slot=0;slot<NUMBERS_IN_BLOCK;slot++) { long el = readNumber(block,slot); if (el == 0L) { // end of the block, move to next one break; } numbers.add(new Long(el)); } long nextBlock = getOffsetToNextBlock(block); if (nextBlock == 0L) { return numbers; } startOffset = nextBlock; } }
void flush() { try { flushDirtyBlocks(); blockCache.clear(); mmapData(); } catch (IOException ex) { ex.printStackTrace(); } }
void addReference(long instanceId) { try { byte flags = getFlags(); long ref = getReferencesPointer(); if ((flags & NUMBER_LIST) == 0) { // reference list is not used if (ref == 0L) { // no reference was set setReferencesPointer(instanceId); } else if (ref != instanceId) { // one reference was set, switch to reference list setFlags((byte)(flags | NUMBER_LIST)); long list = referenceList.addFirstNumber(ref,instanceId); setReferencesPointer(list); } } else { // use reference list long newRef = referenceList.addNumber(ref,instanceId); if (newRef != ref) { setReferencesPointer(newRef); } } } catch (IOException ex) { ex.printStackTrace(); } }
NumberList(int elSize) throws IOException { dataFile = File.createTempFile("NBProfiler", ".ref"); // NOI18N data = new RandomAccessFile(dataFile, "rw"); // NOI18N numberSize = elSize; blockCache = new BlockLRUCache<Long, byte[]>(); dirtyBlocks = new HashSet<Long>(100000); blockSize = (NUMBERS_IN_BLOCK + 1) * numberSize; dataFile.deleteOnExit(); addBlock(); // first block is unused, since it starts at offset 0 }
void flush() { referenceList.flush(); }
long getNearestGCRootPointer() { try { byte flag = getFlags(); if ((flag & GC_ROOT) != 0) { // has GC root pointer long ref = getReferencesPointer(); if ((flag & NUMBER_LIST) != 0) { // get GC root pointer from number list return referenceList.getFirstNumber(ref); } return ref; } } catch (IOException ex) { ex.printStackTrace(); } return 0L; }
private void writeNumber(long blockOffset,byte[] block,int slot,long element) throws IOException { if (blockOffset < mappedSize) { long offset = blockOffset+slot*numberSize; buf.position((int)offset); for (int i=numberSize-1;i>=0;i--) { byte el = (byte)(element >> (i*8)); buf.put(el); } } else { Long offsetObj = new Long(blockOffset); int offset = slot*numberSize; for (int i=numberSize-1;i>=0;i--) { byte el = (byte)(element >> (i*8)); block[offset++]=el; } dirtyBlocks.add(offsetObj); if (dirtyBlocks.size()>10000) { flushDirtyBlocks(); } } }
void putFirst(long startOffset,long number) throws IOException { int slot; long offset = startOffset; long movedNumber = 0; for(;;) { byte[] block = getBlock(offset); for (slot=0;slot<NUMBERS_IN_BLOCK;slot++) { long el = readNumber(block,slot); if (offset == startOffset && slot == 0) { // first block if (number == el) { // already first element return; } movedNumber = el; writeNumber(offset,block,slot,number); } else if (el == 0L) { // end of the block, move to next one break; } else if (el == number) { // number is already in the list writeNumber(offset,block,slot,movedNumber); // replace number and return return; } } offset = getOffsetToNextBlock(block); if (offset == 0L) { System.out.println("Error - number not found at end"); return; } } }
long addFirstNumber(long number1,long number2) throws IOException { long blockOffset = addBlock(); byte[] block = getBlock(blockOffset); writeNumber(blockOffset,block,0,number1); writeNumber(blockOffset,block,1,number2); return blockOffset; }
List getNumbers(long startOffset) throws IOException { int slot; List numbers = new ArrayList(); for(;;) { byte[] block = getBlock(startOffset); for (slot=0;slot<NUMBERS_IN_BLOCK;slot++) { long el = readNumber(block,slot); if (el == 0L) { // end of the block, move to next one break; } numbers.add(new Long(el)); } long nextBlock = getOffsetToNextBlock(block); if (nextBlock == 0L) { return numbers; } startOffset = nextBlock; } }
void flush() { try { flushDirtyBlocks(); blockCache.clear(); mmapData(); } catch (IOException ex) { ex.printStackTrace(); } }
long getFirstNumber(long startOffset) throws IOException { byte[] block = getBlock(startOffset); return readNumber(block,0); }
private long readNumber(byte[] block,int slot) { int offset = slot*numberSize; long el = 0; // for (int i=0;i<numberSize;i++) { // el <<= 8; // el |= ((int)block[offset+i]) & 0xFF; // } if (numberSize == 4) { return ((long)getInt(block,offset)) & 0xFFFFFFFFL; } else if (numberSize == 8) { return getLong(block,offset); } return el; }