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

Commit ad127856 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Add ReadWrite lock to safeguard against concurrent access to the config objects

Bug: 407402114
Test: None
Flag: EXEMPT minor bug fix
Change-Id: Ifc6753ddea2cf0e828c91b92d35dc6c01a8cfd90
parent a4a9f18b
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) {