Fix looping logic bugs.
shiftOut() is getting called once too often through these for loops. Change-Id: I9a68b49e6cc1469bcddd673ab1567e238cf192b8main
parent
104bb70c65
commit
8064c669fe
|
@ -65,6 +65,7 @@ public class FixedLogBuffer extends LogBuffer {
|
||||||
final int numWordsIncoming = newLogUnit.getNumWords();
|
final int numWordsIncoming = newLogUnit.getNumWords();
|
||||||
if (mNumActualWords >= mWordCapacity) {
|
if (mNumActualWords >= mWordCapacity) {
|
||||||
// Give subclass a chance to handle the buffer full condition by shifting out logUnits.
|
// Give subclass a chance to handle the buffer full condition by shifting out logUnits.
|
||||||
|
// TODO: Tell onBufferFull() how much space it needs to make to avoid forced eviction.
|
||||||
onBufferFull();
|
onBufferFull();
|
||||||
// If still full, evict.
|
// If still full, evict.
|
||||||
if (mNumActualWords >= mWordCapacity) {
|
if (mNumActualWords >= mWordCapacity) {
|
||||||
|
@ -119,21 +120,19 @@ public class FixedLogBuffer extends LogBuffer {
|
||||||
/**
|
/**
|
||||||
* Remove LogUnits from the front of the LogBuffer until {@code numWords} have been removed.
|
* Remove LogUnits from the front of the LogBuffer until {@code numWords} have been removed.
|
||||||
*
|
*
|
||||||
* If there are less than {@code numWords} word-containing {@link LogUnit}s, shifts out
|
* If there are less than {@code numWords} in the buffer, shifts out all {@code LogUnit}s.
|
||||||
* all {@code LogUnit}s in the buffer.
|
|
||||||
*
|
*
|
||||||
* @param numWords the minimum number of word-containing {@link LogUnit}s to shift out
|
* @param numWords the minimum number of words in {@link LogUnit}s to shift out
|
||||||
* @return the number of actual {@code LogUnit}s shifted out
|
* @return the number of actual words LogUnit}s shifted out
|
||||||
*/
|
*/
|
||||||
protected int shiftOutWords(final int numWords) {
|
protected int shiftOutWords(final int numWords) {
|
||||||
int numWordContainingLogUnitsShiftedOut = 0;
|
int numWordsShiftedOut = 0;
|
||||||
for (LogUnit logUnit = shiftOut(); logUnit != null
|
do {
|
||||||
&& numWordContainingLogUnitsShiftedOut < numWords; logUnit = shiftOut()) {
|
final LogUnit logUnit = shiftOut();
|
||||||
if (logUnit.hasOneOrMoreWords()) {
|
if (logUnit == null) break;
|
||||||
numWordContainingLogUnitsShiftedOut += logUnit.getNumWords();
|
numWordsShiftedOut += logUnit.getNumWords();
|
||||||
}
|
} while (numWordsShiftedOut < numWords);
|
||||||
}
|
return numWordsShiftedOut;
|
||||||
return numWordContainingLogUnitsShiftedOut;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shiftOutAll() {
|
public void shiftOutAll() {
|
||||||
|
|
|
@ -190,23 +190,31 @@ public abstract class MainLogBuffer extends FixedLogBuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void publishLogUnitsAtFrontOfBuffer() {
|
protected final void publishLogUnitsAtFrontOfBuffer() {
|
||||||
|
// TODO: Refactor this method to require fewer passes through the LogUnits. Should really
|
||||||
|
// require only one pass.
|
||||||
ArrayList<LogUnit> logUnits = peekAtFirstNWords(N_GRAM_SIZE);
|
ArrayList<LogUnit> logUnits = peekAtFirstNWords(N_GRAM_SIZE);
|
||||||
if (isSafeNGram(logUnits, N_GRAM_SIZE)) {
|
if (isSafeNGram(logUnits, N_GRAM_SIZE)) {
|
||||||
// Good n-gram at the front of the buffer. Publish it, disclosing details.
|
// Good n-gram at the front of the buffer. Publish it, disclosing details.
|
||||||
publish(logUnits, true /* canIncludePrivateData */);
|
publish(logUnits, true /* canIncludePrivateData */);
|
||||||
shiftOutWords(N_GRAM_SIZE);
|
shiftOutWords(N_GRAM_SIZE);
|
||||||
mNumWordsUntilSafeToSample = mNumWordsBetweenNGrams;
|
mNumWordsUntilSafeToSample = mNumWordsBetweenNGrams;
|
||||||
} else {
|
return;
|
||||||
|
}
|
||||||
// No good n-gram at front, and buffer is full. Shift out up through the first logUnit
|
// No good n-gram at front, and buffer is full. Shift out up through the first logUnit
|
||||||
// with associated words (or if there is none, all the existing logUnits).
|
// with associated words (or if there is none, all the existing logUnits).
|
||||||
logUnits.clear();
|
logUnits.clear();
|
||||||
for (LogUnit logUnit = shiftOut(); logUnit != null && !logUnit.hasOneOrMoreWords();
|
LogUnit logUnit = shiftOut();
|
||||||
logUnit = shiftOut()) {
|
while (logUnit != null) {
|
||||||
logUnits.add(logUnit);
|
logUnits.add(logUnit);
|
||||||
|
final int numWords = logUnit.getNumWords();
|
||||||
|
if (numWords > 0) {
|
||||||
|
mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample - numWords);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
logUnit = shiftOut();
|
||||||
}
|
}
|
||||||
publish(logUnits, false /* canIncludePrivateData */);
|
publish(logUnits, false /* canIncludePrivateData */);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a list of logUnits should be published.
|
* Called when a list of logUnits should be published.
|
||||||
|
@ -222,12 +230,11 @@ public abstract class MainLogBuffer extends FixedLogBuffer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int shiftOutWords(final int numWords) {
|
protected int shiftOutWords(final int numWords) {
|
||||||
final int numWordContainingLogUnitsShiftedOut = super.shiftOutWords(numWords);
|
final int numWordsShiftedOut = super.shiftOutWords(numWords);
|
||||||
mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample
|
mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample - numWordsShiftedOut);
|
||||||
- numWordContainingLogUnitsShiftedOut);
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "wordsUntilSafeToSample now at " + mNumWordsUntilSafeToSample);
|
Log.d(TAG, "wordsUntilSafeToSample now at " + mNumWordsUntilSafeToSample);
|
||||||
}
|
}
|
||||||
return numWordContainingLogUnitsShiftedOut;
|
return numWordsShiftedOut;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue