@Override public String toString() { return "BitSetNode(" + getStart() + "-" + getEnd() + ")"; }
/** * @return all the active procedure ids in this bit set. */ public long[] getActiveProcIds() { List<Long> procIds = new ArrayList<>(); for (int wordIndex = 0; wordIndex < modified.length; wordIndex++) { if (deleted[wordIndex] == WORD_MASK || modified[wordIndex] == 0) { // This should be the common case, where most procedures has been deleted. continue; } long baseProcId = getStart() + (wordIndex << ADDRESS_BITS_PER_WORD); for (int i = 0; i < (1 << ADDRESS_BITS_PER_WORD); i++) { long mask = 1L << i; if ((deleted[wordIndex] & mask) == 0 && (modified[wordIndex] & mask) != 0) { procIds.add(baseProcId + i); } } } return procIds.stream().mapToLong(Long::longValue).toArray(); }
public void dump() { System.out.printf("%06d:%06d min=%d max=%d%n", getStart(), getEnd(), getActiveMinProcId(), getActiveMaxProcId()); System.out.println("Modified:"); for (int i = 0; i < modified.length; ++i) { for (int j = 0; j < BITS_PER_WORD; ++j) { System.out.print((modified[i] & (1L << j)) != 0 ? "1" : "0"); } System.out.println(" " + i); } System.out.println(); System.out.println("Delete:"); for (int i = 0; i < deleted.length; ++i) { for (int j = 0; j < BITS_PER_WORD; ++j) { System.out.print((deleted[i] & (1L << j)) != 0 ? "1" : "0"); } System.out.println(" " + i); } System.out.println(); }
public void resetToProto(ProcedureProtos.ProcedureStoreTracker trackerProtoBuf) { reset(); for (ProcedureProtos.ProcedureStoreTracker.TrackerNode protoNode: trackerProtoBuf.getNodeList()) { final BitSetNode node = new BitSetNode(protoNode); map.put(node.getStart(), node); } }
private void setDeleteIf(ProcedureStoreTracker tracker, BiFunction<BitSetNode, Long, Boolean> func) { BitSetNode trackerNode = null; for (BitSetNode node : map.values()) { long minProcId = node.getStart(); long maxProcId = node.getEnd(); for (long procId = minProcId; procId <= maxProcId; ++procId) { if (!node.isModified(procId)) { continue; } trackerNode = tracker.lookupClosestNode(trackerNode, procId); if (func.apply(trackerNode, procId)) { node.delete(procId); } } } }
private BitSetNode delete(BitSetNode node, long procId) { node = lookupClosestNode(node, procId); if (node == null || !node.contains(procId)) { LOG.warn("The BitSetNode for procId={} does not exist, maybe a double deletion?", procId); return node; } node.delete(procId); if (!keepDeletes && node.isEmpty()) { // TODO: RESET if (map.size() == 1) map.remove(node.getStart()); } trackProcIds(procId); return node; }
@Test public void testMerge() { BitSetNode node = new BitSetNode(1000, false); assertTrue(node.canMerge(new BitSetNode(1200, false))); assertFalse(node.canMerge(new BitSetNode(10000, false))); BitSetNode rightNode = new BitSetNode(1200, false); node.merge(rightNode); assertTrue(node.isModified(1000)); assertTrue(node.isModified(1200)); for (long i = node.getStart(); i <= node.getEnd(); i++) { if (i != 1000 && i != 1200) { assertEquals(DeleteState.YES, node.isDeleted(i)); } else { assertEquals(DeleteState.NO, node.isDeleted(i)); } } } }
@Test public void testGrow() { BitSetNode node = new BitSetNode(1000, false); // contains, do not need to grow but should not fail assertTrue(node.canGrow(1024)); assertTrue(node.canGrow(900)); assertTrue(node.canGrow(1100)); assertFalse(node.canGrow(100)); assertFalse(node.canGrow(10000)); // grow to right node.grow(1100); assertTrue(node.contains(1100)); assertTrue(node.isModified(1000)); // grow to left node.grow(900); assertTrue(node.contains(900)); assertTrue(node.isModified(1000)); for (long i = node.getStart(); i <= node.getEnd(); i++) { if (i != 1000) { assertEquals(DeleteState.YES, node.isDeleted(i)); } else { assertEquals(DeleteState.NO, node.isDeleted(i)); } } }
@Override public String toString() { return "BitSetNode(" + getStart() + "-" + getEnd() + ")"; }
/** * @return all the active procedure ids in this bit set. */ public long[] getActiveProcIds() { List<Long> procIds = new ArrayList<>(); for (int wordIndex = 0; wordIndex < modified.length; wordIndex++) { if (deleted[wordIndex] == WORD_MASK || modified[wordIndex] == 0) { // This should be the common case, where most procedures has been deleted. continue; } long baseProcId = getStart() + (wordIndex << ADDRESS_BITS_PER_WORD); for (int i = 0; i < (1 << ADDRESS_BITS_PER_WORD); i++) { long mask = 1L << i; if ((deleted[wordIndex] & mask) == 0 && (modified[wordIndex] & mask) != 0) { procIds.add(baseProcId + i); } } } return procIds.stream().mapToLong(Long::longValue).toArray(); }
public void dump() { System.out.printf("%06d:%06d min=%d max=%d%n", getStart(), getEnd(), getActiveMinProcId(), getActiveMaxProcId()); System.out.println("Modified:"); for (int i = 0; i < modified.length; ++i) { for (int j = 0; j < BITS_PER_WORD; ++j) { System.out.print((modified[i] & (1L << j)) != 0 ? "1" : "0"); } System.out.println(" " + i); } System.out.println(); System.out.println("Delete:"); for (int i = 0; i < deleted.length; ++i) { for (int j = 0; j < BITS_PER_WORD; ++j) { System.out.print((deleted[i] & (1L << j)) != 0 ? "1" : "0"); } System.out.println(" " + i); } System.out.println(); }
public void resetToProto(ProcedureProtos.ProcedureStoreTracker trackerProtoBuf) { reset(); for (ProcedureProtos.ProcedureStoreTracker.TrackerNode protoNode: trackerProtoBuf.getNodeList()) { final BitSetNode node = new BitSetNode(protoNode); map.put(node.getStart(), node); } }
private void setDeleteIf(ProcedureStoreTracker tracker, BiFunction<BitSetNode, Long, Boolean> func) { BitSetNode trackerNode = null; for (BitSetNode node : map.values()) { long minProcId = node.getStart(); long maxProcId = node.getEnd(); for (long procId = minProcId; procId <= maxProcId; ++procId) { if (!node.isModified(procId)) { continue; } trackerNode = tracker.lookupClosestNode(trackerNode, procId); if (func.apply(trackerNode, procId)) { node.delete(procId); } } } }
private BitSetNode delete(BitSetNode node, long procId) { node = lookupClosestNode(node, procId); if (node == null || !node.contains(procId)) { LOG.warn("The BitSetNode for procId={} does not exist, maybe a double deletion?", procId); return node; } node.delete(procId); if (!keepDeletes && node.isEmpty()) { // TODO: RESET if (map.size() == 1) map.remove(node.getStart()); } trackProcIds(procId); return node; }
@Test public void testMerge() { BitSetNode node = new BitSetNode(1000, false); assertTrue(node.canMerge(new BitSetNode(1200, false))); assertFalse(node.canMerge(new BitSetNode(10000, false))); BitSetNode rightNode = new BitSetNode(1200, false); node.merge(rightNode); assertTrue(node.isModified(1000)); assertTrue(node.isModified(1200)); for (long i = node.getStart(); i <= node.getEnd(); i++) { if (i != 1000 && i != 1200) { assertEquals(DeleteState.YES, node.isDeleted(i)); } else { assertEquals(DeleteState.NO, node.isDeleted(i)); } } } }