protected WriteSet(Cons<VBox> boxesWrittenInPlace, Cons<ParallelNestedTransaction> mergedTxs, Map<VBox, Object> boxesWritten, Map<VArrayEntry<?>, VArrayEntry<?>> arrayWrites, Map<VArray<?>, Integer> arrayWritesCount, ReadWriteTransaction committer, int blockSize) { int boxesWrittenInPlaceSize = boxesWrittenInPlace.size(); for (ParallelNestedTransaction mergedTx : mergedTxs) { boxesWrittenInPlaceSize += mergedTx.boxesWrittenInPlace.size();
protected void consolidateElementsIfLoaded() { if (elementsToAdd.get().size() + elementsToRemove.get().size() > 0) { VBox<FunctionalSet<E2>> box = getElementsBox(); if (box.hasValue()) { consolidateElements(); } else { // here we write the NOT_LOADED_VALUE to force the box to go to the write-set box.putNotLoadedValue(); } } }
protected WriteSet(Cons<VBox> vboxesWrittenBack) { int writeSetLength = vboxesWrittenBack.size(); int nBlocks = 1; int blockSize = writeSetLength; VBox[] vboxes = new VBox[writeSetLength]; Object[] values = new Object[writeSetLength]; Cons<GarbageCollectable>[] bodiesPerBlock = new Cons[nBlocks]; AtomicBoolean[] blocksDone = new AtomicBoolean[nBlocks]; int pos = 0; Cons<GarbageCollectable> bodiesCommitted = Cons.empty(); for (VBox vbox : vboxesWrittenBack) { vboxes[pos] = vbox; values[pos++] = vbox.body.value; bodiesCommitted = bodiesCommitted.cons(vbox.body); } bodiesPerBlock[0] = bodiesCommitted; blocksDone[0] = new AtomicBoolean(true); this.normalWriteSet = new BoxesToCommit(nBlocks, blockSize, vboxes, values, writeSetLength, bodiesPerBlock, blocksDone); this.arrayCommitState = new VArrayCommitState[0]; }
private SimpleWriteSet makeSimpleWriteSet() { // code adapted from jvstm.WriteSet. It's a bit redundant, and cumbersome to maintain if the original code happens to change :-/ This should be refactored // CODE TO DEAL WITH PARALLEL NESTED TRANSACTIONS WAS REMOVED FROM THE ORIGINAL VERSION int maxRequiredSize = this.boxesWrittenInPlace.size() + this.boxesWritten.size(); String[] vboxIds = new String[maxRequiredSize]; Object[] values = new Object[maxRequiredSize]; int pos = 0; // Deal with VBoxes written in place for (jvstm.VBox vbox : this.boxesWrittenInPlace) { vboxIds[pos] = ((VBox) vbox).getId(); values[pos++] = vbox.getInplace().tempValue; vbox.getInplace().next = null; } // Deal with VBoxes written in the fallback write-set for (Map.Entry<jvstm.VBox, Object> entry : boxesWritten.entrySet()) { jvstm.VBox vbox = entry.getKey(); if (vbox.getInplace().orec.owner == this) { // if we also wrote directly to the box, we just skip this value continue; } vboxIds[pos] = ((VBox) vbox).getId(); values[pos++] = entry.getValue(); } int writeSetLength = pos; return new SimpleWriteSet(Arrays.copyOf(vboxIds, writeSetLength), Arrays.copyOf(values, writeSetLength)); }
logger.debug("Found {} version(s) to load", entries.size());
private void consolidateElements() { VBox<FunctionalSet<E2>> box = getElementsBox(); FunctionalSet<E2> origSet = box.get(listHolder, attributeName); FunctionalSet<E2> newSet = origSet; if (elementsToRemove.get().size() > 0) { Iterator<E2> iter = elementsToRemove.get().iterator(); while (iter.hasNext()) { newSet = newSet.remove(iter.next()); } elementsToRemove.put(Cons.<E2> empty()); } if (elementsToAdd.get().size() > 0) { Iterator<E2> iter = elementsToAdd.get().iterator(); while (iter.hasNext()) { newSet = newSet.add(iter.next()); } elementsToAdd.put(Cons.<E2> empty()); } if (newSet != origSet) { // Because a nested FenixConsistencyCheckTransaction cannot perform writes, but may need to // consolidate the elements of a relation changed by the parent transaction box.putInParent(newSet); } }