From 73454c3371c6c031c602b6ae90a565a96175e685 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Fri, 3 Apr 2020 18:56:19 -0700 Subject: Check if the trace was stopped before starting the tracing thread If a winscope trace is started and stopped quickly, the tracing thread will not be stopped. The tracing thread waits for a conditional variable notification that is sent before the thread starts running. To fix the issue, properly initialize the trace enabled variable in the tracing thread. Test: atest FlickerLibTest:LayersTraceMonitorTest Fixes: 153206487 Change-Id: I0c591c1fc3209327b40323b3ebb4fa4279c6ed05 --- services/surfaceflinger/SurfaceTracing.cpp | 7 +++---- services/surfaceflinger/SurfaceTracing.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/services/surfaceflinger/SurfaceTracing.cpp b/services/surfaceflinger/SurfaceTracing.cpp index a9c33327c8..68ecfd1b83 100644 --- a/services/surfaceflinger/SurfaceTracing.cpp +++ b/services/surfaceflinger/SurfaceTracing.cpp @@ -36,22 +36,21 @@ SurfaceTracing::SurfaceTracing(SurfaceFlinger& flinger) : mFlinger(flinger), mSfLock(flinger.mDrawingStateLock) {} void SurfaceTracing::mainLoop() { - addFirstEntry(); - bool enabled = true; + bool enabled = addFirstEntry(); while (enabled) { LayersTraceProto entry = traceWhenNotified(); enabled = addTraceToBuffer(entry); } } -void SurfaceTracing::addFirstEntry() { +bool SurfaceTracing::addFirstEntry() { const auto displayDevice = mFlinger.getDefaultDisplayDevice(); LayersTraceProto entry; { std::scoped_lock lock(mSfLock); entry = traceLayersLocked("tracing.enable", displayDevice); } - addTraceToBuffer(entry); + return addTraceToBuffer(entry); } LayersTraceProto SurfaceTracing::traceWhenNotified() { diff --git a/services/surfaceflinger/SurfaceTracing.h b/services/surfaceflinger/SurfaceTracing.h index 83872ed3ae..5dae1697dd 100644 --- a/services/surfaceflinger/SurfaceTracing.h +++ b/services/surfaceflinger/SurfaceTracing.h @@ -85,7 +85,7 @@ private: }; void mainLoop(); - void addFirstEntry(); + bool addFirstEntry(); LayersTraceProto traceWhenNotified(); LayersTraceProto traceLayersLocked(const char* where, const sp& displayDevice) -- cgit v1.2.3-59-g8ed1b