Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1eb1af75 authored by Kurt Partridge's avatar Kurt Partridge Committed by Android (Google) Code Review
Browse files

Merge "Fix looping logic bugs."

parents 542bcbea 8064c669
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ public class FixedLogBuffer extends LogBuffer {
        final int numWordsIncoming = newLogUnit.getNumWords();
        if (mNumActualWords >= mWordCapacity) {
            // 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();
            // If still full, evict.
            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.
     *
     * If there are less than {@code numWords} word-containing {@link LogUnit}s, shifts out
     * all {@code LogUnit}s in the buffer.
     * If there are less than {@code numWords} in the buffer, shifts out all {@code LogUnit}s.
     *
     * @param numWords the minimum number of word-containing {@link LogUnit}s to shift out
     * @return the number of actual {@code LogUnit}s shifted out
     * @param numWords the minimum number of words in {@link LogUnit}s to shift out
     * @return the number of actual words LogUnit}s shifted out
     */
    protected int shiftOutWords(final int numWords) {
        int numWordContainingLogUnitsShiftedOut = 0;
        for (LogUnit logUnit = shiftOut(); logUnit != null
                && numWordContainingLogUnitsShiftedOut < numWords; logUnit = shiftOut()) {
            if (logUnit.hasOneOrMoreWords()) {
                numWordContainingLogUnitsShiftedOut += logUnit.getNumWords();
            }
        }
        return numWordContainingLogUnitsShiftedOut;
        int numWordsShiftedOut = 0;
        do {
            final LogUnit logUnit = shiftOut();
            if (logUnit == null) break;
            numWordsShiftedOut += logUnit.getNumWords();
        } while (numWordsShiftedOut < numWords);
        return numWordsShiftedOut;
    }

    public void shiftOutAll() {
+19 −12
Original line number Diff line number Diff line
@@ -190,22 +190,30 @@ public abstract class MainLogBuffer extends FixedLogBuffer {
    }

    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);
        if (isSafeNGram(logUnits, N_GRAM_SIZE)) {
            // Good n-gram at the front of the buffer.  Publish it, disclosing details.
            publish(logUnits, true /* canIncludePrivateData */);
            shiftOutWords(N_GRAM_SIZE);
            mNumWordsUntilSafeToSample = mNumWordsBetweenNGrams;
        } else {
            return;
        }
        // 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).
        logUnits.clear();
            for (LogUnit logUnit = shiftOut(); logUnit != null && !logUnit.hasOneOrMoreWords();
                    logUnit = shiftOut()) {
        LogUnit logUnit = shiftOut();
        while (logUnit != null) {
            logUnits.add(logUnit);
            final int numWords = logUnit.getNumWords();
            if (numWords > 0) {
                mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample - numWords);
                break;
            }
            publish(logUnits, false /* canIncludePrivateData */);
            logUnit = shiftOut();
        }
        publish(logUnits, false /* canIncludePrivateData */);
    }

    /**
@@ -222,12 +230,11 @@ public abstract class MainLogBuffer extends FixedLogBuffer {

    @Override
    protected int shiftOutWords(final int numWords) {
        final int numWordContainingLogUnitsShiftedOut = super.shiftOutWords(numWords);
        mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample
                - numWordContainingLogUnitsShiftedOut);
        final int numWordsShiftedOut = super.shiftOutWords(numWords);
        mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample - numWordsShiftedOut);
        if (DEBUG) {
            Log.d(TAG, "wordsUntilSafeToSample now at " + mNumWordsUntilSafeToSample);
        }
        return numWordContainingLogUnitsShiftedOut;
        return numWordsShiftedOut;
    }
}