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

Commit 0a91f032 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add ReadWrite lock to safeguard against concurrent access to the config objects" into main

parents f24795f6 ad127856
Loading
Loading
Loading
Loading
+43 −10
Original line number Diff line number Diff line
@@ -86,7 +86,9 @@ import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * A service for the ProtoLog logging system.
@@ -112,6 +114,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen
    @NonNull
    private final Map<String, Integer> mCollectStackTraceGroupCounts = new ArrayMap<>();

    @NonNull
    private final ReadWriteLock mConfigUpdaterLock = new ReentrantReadWriteLock();

    private final Lock mBackgroundServiceLock = new ReentrantLock();
    protected ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor();

@@ -282,10 +287,16 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen

    @Override
    public boolean isEnabled(IProtoLogGroup group, LogLevel level) {
        var readLock = mConfigUpdaterLock.readLock();
        readLock.lock();
        try {
            final int[] groupLevelCount = mLogLevelCounts.get(group.name());
            return (groupLevelCount == null && mDefaultLogLevelCounts[level.ordinal()] > 0)
                    || (groupLevelCount != null && groupLevelCount[level.ordinal()] > 0)
                    || group.isLogToLogcat();
        } finally {
            readLock.unlock();
        }
    }

    @Override
@@ -372,8 +383,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen
            } else {
                stacktrace = null;
            }
            try {
            mBackgroundServiceLock.lock();
            try {
                mBackgroundLoggingService.execute(() ->
                        logToProto(logLevel, group, message, args, tsNanos,
                                stacktrace));
@@ -390,8 +401,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen
        Log.d(LOG_TAG, "Executing onTracingFlush");

        final ExecutorService loggingService;
        try {
        mBackgroundServiceLock.lock();
        try {
            loggingService = mBackgroundLoggingService;
            mBackgroundLoggingService = Executors.newSingleThreadExecutor();
        } finally {
@@ -741,10 +752,22 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen
        return -1;
    }

    private synchronized void onTracingInstanceStart(
    private void onTracingInstanceStart(
            int instanceIdx, ProtoLogDataSource.ProtoLogConfig config) {
        Log.d(LOG_TAG, "Executing onTracingInstanceStart");

        var writeLock = mConfigUpdaterLock.writeLock();
        writeLock.lock();
        try {
            onTracingInstanceStartLocked(config);
        } finally {
            writeLock.unlock();
        }

        Log.d(LOG_TAG, "Finished onTracingInstanceStart");
    }

    private void onTracingInstanceStartLocked(ProtoLogDataSource.ProtoLogConfig config) {
        final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom;
        for (int i = defaultLogFrom.ordinal(); i < LogLevel.values().length; i++) {
            mDefaultLogLevelCounts[i]++;
@@ -775,13 +798,24 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen
        mCacheUpdater.update(this);

        this.mTracingInstances.incrementAndGet();

        Log.d(LOG_TAG, "Finished onTracingInstanceStart");
    }

    private synchronized void onTracingInstanceStop(
            int instanceIdx, ProtoLogDataSource.ProtoLogConfig config) {
        Log.d(LOG_TAG, "Executing onTracingInstanceStop");

        var writeLock = mConfigUpdaterLock.writeLock();
        writeLock.lock();
        try {
            onTracingInstanceStopLocked(config);
        } finally {
            writeLock.unlock();
        }

        Log.d(LOG_TAG, "Finished onTracingInstanceStop");
    }

    private void onTracingInstanceStopLocked(ProtoLogDataSource.ProtoLogConfig config) {
        this.mTracingInstances.decrementAndGet();

        final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom;
@@ -813,7 +847,6 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen
        }

        mCacheUpdater.update(this);
        Log.d(LOG_TAG, "Finished onTracingInstanceStop");
    }

    private static void logAndPrintln(@Nullable PrintWriter pw, String msg) {