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

Commit 47e0424b authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Merge cherrypicks of [13524839, 13524840, 13524841, 13524928, 13524929,...

Merge cherrypicks of [13524839, 13524840, 13524841, 13524928, 13524929, 13524930, 13522744, 13524951, 13524860, 13524371, 13524372, 13524373, 13524374, 13524861, 13525166, 13525167, 13525168, 13524843, 13524957, 13524958, 13524936, 13525246, 13524939, 13524940, 13525248, 13524942, 13525249, 13525250, 13525251, 13524943, 13525169, 13525170, 13524358, 13524961, 13524962, 13524963, 13524966, 13524844, 13525325, 13525326, 13524964, 13525327, 13525328, 13524359, 13525307, 13525345] into rvc-qpr2-release

Change-Id: I8328acedee0dc20031cf42c924d42c1b623d3ce9
parents b17db7a3 02d2eb52
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -334,6 +334,7 @@ void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) {
}

int StatsPullerManager::ForceClearPullerCache() {
    std::lock_guard<std::mutex> _l(mLock);
    int totalCleared = 0;
    for (const auto& pulledAtom : kAllPullAtomInfo) {
        totalCleared += pulledAtom.second->ForceClearCache();
@@ -342,6 +343,7 @@ int StatsPullerManager::ForceClearPullerCache() {
}

int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) {
    std::lock_guard<std::mutex> _l(mLock);
    int totalCleared = 0;
    for (const auto& pulledAtom : kAllPullAtomInfo) {
        totalCleared += pulledAtom.second->ClearCacheIfNecessary(timestampNs);
+23 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include <android-base/stringprintf.h>
#include <android/binder_ibinder.h>
#include <log/log.h>
#include <private/android_filesystem_config.h>

#include "annotations.h"
@@ -216,13 +217,18 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last,
        last[2] = true;
        parseString(pos, /*depth=*/2, last, /*numAnnotations=*/0);
    }
    // Check if at least one node was successfully parsed.
    if (mValues.size() - 1 > firstUidInChainIndex) {

    if (mValues.size() - 1 > INT8_MAX) {
        mValid = false;
    } else if (mValues.size() - 1 > firstUidInChainIndex) {
        // At least one node was successfully parsed.
        mAttributionChainStartIndex = static_cast<int8_t>(firstUidInChainIndex);
        mAttributionChainEndIndex = static_cast<int8_t>(mValues.size() - 1);
    }

    if (mValid) {
        parseAnnotations(numAnnotations, firstUidInChainIndex);
    }

    pos[1] = pos[2] = 1;
    last[1] = last[2] = false;
@@ -234,7 +240,8 @@ bool LogEvent::checkPreviousValueType(Type expected) {
}

void LogEvent::parseIsUidAnnotation(uint8_t annotationType) {
    if (mValues.empty() || !checkPreviousValueType(INT) || annotationType != BOOL_TYPE) {
    if (mValues.empty() || mValues.size() - 1 > INT8_MAX || !checkPreviousValueType(INT)
            || annotationType != BOOL_TYPE) {
        mValid = false;
        return;
    }
@@ -270,6 +277,12 @@ void LogEvent::parsePrimaryFieldFirstUidAnnotation(uint8_t annotationType,
        return;
    }

    if (static_cast<int>(mValues.size() - 1) < firstUidInChainIndex) { // AttributionChain is empty.
        mValid = false;
        android_errorWriteLog(0x534e4554, "174485572");
        return;
    }

    const bool primaryField = readNextValue<uint8_t>();
    mValues[firstUidInChainIndex].mAnnotations.setPrimaryField(primaryField);
}
@@ -280,6 +293,12 @@ void LogEvent::parseExclusiveStateAnnotation(uint8_t annotationType) {
        return;
    }

    if (mValues.size() - 1 > INT8_MAX) {
        android_errorWriteLog(0x534e4554, "174488848");
        mValid = false;
        return;
    }

    const bool exclusiveState = readNextValue<uint8_t>();
    mExclusiveStateFieldIndex = static_cast<int8_t>(mValues.size() - 1);
    mValues[getExclusiveStateFieldIndex()].mAnnotations.setExclusiveState(exclusiveState);
+110 −0
Original line number Diff line number Diff line
@@ -363,6 +363,116 @@ TEST(LogEventTest, TestResetStateAnnotation) {
    EXPECT_EQ(event.getResetState(), resetState);
}

TEST(LogEventTest, TestExclusiveStateAnnotationAfterTooManyFields) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    const unsigned int numAttributionNodes = 64;

    uint32_t uids[numAttributionNodes];
    const char* tags[numAttributionNodes];

    for (unsigned int i = 1; i <= numAttributionNodes; i++) {
        uids[i-1] = i;
        tags[i-1] = std::to_string(i).c_str();
    }

    AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes);
    AStatsEvent_writeInt32(event, 1);
    AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_EXCLUSIVE_STATE, true);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));
    EXPECT_EQ(-1, logEvent.getExclusiveStateFieldIndex());

    AStatsEvent_release(event);
}

TEST(LogEventTest, TestUidAnnotationAfterTooManyFields) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    const unsigned int numAttributionNodes = 64;

    uint32_t uids[numAttributionNodes];
    const char* tags[numAttributionNodes];

    for (unsigned int i = 1; i <= numAttributionNodes; i++) {
        uids[i-1] = i;
        tags[i-1] = std::to_string(i).c_str();
    }

    AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes);
    AStatsEvent_writeInt32(event, 1);
    AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_IS_UID, true);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));
    EXPECT_EQ(-1, logEvent.getUidFieldIndex());

    AStatsEvent_release(event);
}

TEST(LogEventTest, TestAttributionChainEndIndexAfterTooManyFields) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    const unsigned int numAttributionNodes = 65;

    uint32_t uids[numAttributionNodes];
    const char* tags[numAttributionNodes];

    for (unsigned int i = 1; i <= numAttributionNodes; i++) {
        uids[i-1] = i;
        tags[i-1] = std::to_string(i).c_str();
    }

    AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));
    EXPECT_FALSE(logEvent.hasAttributionChain());

    AStatsEvent_release(event);
}

TEST(LogEventTest, TestEmptyAttributionChainWithPrimaryFieldFirstUidAnnotation) {
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, 100);

    uint32_t uids[] = {};
    const char* tags[] = {};

    AStatsEvent_writeInt32(event, 10);
    AStatsEvent_writeAttributionChain(event, uids, tags, 0);
    AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);

    AStatsEvent_build(event);

    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_FALSE(logEvent.parseBuffer(buf, size));

    AStatsEvent_release(event);
}

}  // namespace statsd
}  // namespace os
}  // namespace android
+7 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.view;

import android.annotation.NonNull;
import android.os.IBinder;

/**
@@ -31,17 +32,20 @@ public final class InputApplicationHandle {
    private long ptr;

    // Application name.
    public String name;
    public final @NonNull String name;

    // Dispatching timeout.
    public long dispatchingTimeoutNanos;
    public final long dispatchingTimeoutNanos;

    public final IBinder token;

    private native void nativeDispose();

    public InputApplicationHandle(IBinder token) {
    public InputApplicationHandle(@NonNull IBinder token, @NonNull String name,
            long dispatchingTimeoutNanos) {
        this.token = token;
        this.name = name;
        this.dispatchingTimeoutNanos = dispatchingTimeoutNanos;
    }

    public InputApplicationHandle(InputApplicationHandle handle) {
+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ public final class InputWindowHandle {
    private long ptr;

    // The input application handle.
    public final InputApplicationHandle inputApplicationHandle;
    public InputApplicationHandle inputApplicationHandle;

    // The token associates input data with a window and its input channel. The client input
    // channel and the server input channel will both contain this token.
Loading