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

Commit 8facddba authored by Kurt Partridge's avatar Kurt Partridge Committed by Android Git Automerger
Browse files

am 9b5965d4: am 1eb1af75: Merge "Fix looping logic bugs."

* commit '9b5965d4':
  Fix looping logic bugs.
parents 517f7865 9b5965d4
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;
    }
}