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

Commit 621ff5c4 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Ensure we wait for all messages to be traced before terminating the trace

Flag: NONE bug fix
Test: atest com.android.internal.protolog.PerfettoProtoLogImplTest
Change-Id: I49684b903ecfd5625074e64f30db41500e962d04
parent 9ef20b41
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -82,7 +82,10 @@ import java.util.TreeMap;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
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.ReentrantLock;

/**
 * A service for the ProtoLog logging system.
@@ -93,7 +96,7 @@ public class PerfettoProtoLogImpl implements IProtoLog {

    private final ProtoLogDataSource mDataSource = new ProtoLogDataSource(
            this::onTracingInstanceStart,
            this::dumpTransitionTraceConfig,
            this::onTracingFlush,
            this::onTracingInstanceStop
    );
    private final ProtoLogViewerConfigReader mViewerConfigReader;
@@ -104,7 +107,8 @@ public class PerfettoProtoLogImpl implements IProtoLog {
    private final int[] mDefaultLogLevelCounts = new int[LogLevel.values().length];
    private final Map<IProtoLogGroup, int[]> mLogLevelCounts = new ArrayMap<>();

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

    public PerfettoProtoLogImpl(String viewerConfigFilePath, Runnable cacheUpdater) {
        this(() -> {
@@ -179,6 +183,30 @@ public class PerfettoProtoLogImpl implements IProtoLog {
        }
    }

    private void onTracingFlush() {
        final ExecutorService loggingService;
        try {
            mBackgroundServiceLock.lock();
            loggingService = mBackgroundLoggingService;
            mBackgroundLoggingService = Executors.newSingleThreadExecutor();
        } finally {
            mBackgroundServiceLock.unlock();
        }

        try {
            loggingService.shutdown();
            boolean finished = loggingService.awaitTermination(10, TimeUnit.SECONDS);

            if (!finished) {
                Log.e(LOG_TAG, "ProtoLog background tracing service didn't finish gracefully.");
            }
        } catch (InterruptedException e) {
            Log.e(LOG_TAG, "Failed to wait for tracing to finish", e);
        }

        dumpTransitionTraceConfig();
    }

    private void dumpTransitionTraceConfig() {
        if (mViewerConfigInputStreamProvider == null) {
            // No viewer config available