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
diff --git a/services/surfaceflinger/SurfaceTracing.cpp b/services/surfaceflinger/SurfaceTracing.cpp
index a9c3332..68ecfd1 100644
--- a/services/surfaceflinger/SurfaceTracing.cpp
+++ b/services/surfaceflinger/SurfaceTracing.cpp
@@ -36,22 +36,21 @@
: 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() {