private static void reclaim( @NotNull final PatriciaReclaimSourceTraverser source, @NotNull final PatriciaReclaimActualTraverser actual) { final NodeBase actualNode = actual.currentNode; final NodeBase sourceNode = source.currentNode; if (actualNode.getAddress() == sourceNode.getAddress()) { actual.currentNode = actualNode.getMutableCopy(actual.mainTree); actual.getItr(); actual.wasReclaim = true; reclaimActualChildren(source, actual); } else { @NotNull ByteIterator srcItr = sourceNode.keySequence.iterator(); @NotNull ByteIterator actItr = actualNode.keySequence.iterator(); int srcPushes = 0; int actPushes = 0; while (true) { if (srcItr.hasNext()) { if (actItr.hasNext()) { if (srcItr.next() != actItr.next()) { // key is not matching break; } } else { final NodeChildrenIterator children = actual.currentNode.getChildren(srcItr.next()); final ChildReference child = children.getNode(); if (child == null) { break; } actual.currentChild = child; actual.currentIterator = children; actual.moveDown(); ++actPushes; actItr = actual.currentNode.keySequence.iterator(); } } else if (actItr.hasNext()) { final NodeChildrenIterator children = source.currentNode.getChildren(actItr.next()); final ChildReference child = children.getNode(); if (child == null || !source.isAddressReclaimable(child.suffixAddress)) { break; // child can be expired if source parent was already not-current } source.currentChild = child; source.currentIterator = children; source.moveDown(); ++srcPushes; srcItr = source.currentNode.keySequence.iterator(); } else { // both iterators matched, here comes the branching reclaimChildren(source, actual); break; } } for (int i = 0; i < srcPushes; ++i) { source.moveUp(); } for (int i = 0; i < actPushes; ++i) { actual.popAndMutate(); } } }
private static void reclaimActualChildren( @NotNull final PatriciaReclaimSourceTraverser source, @NotNull final PatriciaReclaimActualTraverser actual) { while (actual.isValidPos()) { final ChildReference actualChild = actual.currentChild; final long suffixAddress = actualChild.suffixAddress; if (source.isAddressReclaimable(suffixAddress)) { actual.moveDown(); actual.currentNode = actual.currentNode.getMutableCopy(actual.mainTree); actual.getItr(); actual.wasReclaim = true; reclaimActualChildren(source, actual); actual.popAndMutate(); } actual.moveRight(); } }