diff options
| author | 2020-03-11 21:49:57 +0000 | |
|---|---|---|
| committer | 2020-03-11 21:49:57 +0000 | |
| commit | 9fd126d0b550e4b1c5c55c6f90c73c6894793c90 (patch) | |
| tree | cc40d5f3981505f0d18c9823583a36871d2b1c5d | |
| parent | dc5f0ff4eb9e393d2f8fce83ed92d77e33c4f4ce (diff) | |
| parent | 5793c7d8d85e25a4226178a96b3b7f81a76da501 (diff) | |
Merge "[SurfaceFlinger] Resolve deadlock in SurfaceTracing." into rvc-dev
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 12 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceTracing.cpp | 11 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceTracing.h | 10 |
4 files changed, 23 insertions, 13 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 91b1c73419..61c60440d9 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4482,12 +4482,11 @@ void SurfaceFlinger::dumpWideColorInfo(std::string& result) const { result.append("\n"); } -LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t traceFlags) const { - Mutex::Autolock _l(mStateLock); - const auto device = getDefaultDisplayDeviceLocked(); +LayersProto SurfaceFlinger::dumpDrawingStateProto( + uint32_t traceFlags, const sp<const DisplayDevice>& displayDevice) const { LayersProto layersProto; for (const sp<Layer>& layer : mDrawingState.layersSortedByZ) { - layer->writeToProto(layersProto, traceFlags, device); + layer->writeToProto(layersProto, traceFlags, displayDevice); } return layersProto; @@ -4519,7 +4518,10 @@ void SurfaceFlinger::dumpOffscreenLayersProto(LayersProto& layersProto, uint32_t LayersProto SurfaceFlinger::dumpProtoFromMainThread(uint32_t traceFlags) { LayersProto layersProto; - postMessageSync(new LambdaMessage([&]() { layersProto = dumpDrawingStateProto(traceFlags); })); + postMessageSync(new LambdaMessage([&]() { + const auto& displayDevice = getDefaultDisplayDeviceLocked(); + layersProto = dumpDrawingStateProto(traceFlags, displayDevice); + })); return layersProto; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index e6b91e6627..ba265adc39 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -923,7 +923,8 @@ private: void dumpDisplayIdentificationData(std::string& result) const; void dumpRawDisplayIdentificationData(const DumpArgs&, std::string& result) const; void dumpWideColorInfo(std::string& result) const; - LayersProto dumpDrawingStateProto(uint32_t traceFlags = SurfaceTracing::TRACE_ALL) const; + LayersProto dumpDrawingStateProto(uint32_t traceFlags = SurfaceTracing::TRACE_ALL, + const sp<const DisplayDevice>& displayDevice = nullptr) const; void dumpOffscreenLayersProto(LayersProto& layersProto, uint32_t traceFlags = SurfaceTracing::TRACE_ALL) const; // Dumps state from HW Composer diff --git a/services/surfaceflinger/SurfaceTracing.cpp b/services/surfaceflinger/SurfaceTracing.cpp index c5556ec28f..20c8d7a3aa 100644 --- a/services/surfaceflinger/SurfaceTracing.cpp +++ b/services/surfaceflinger/SurfaceTracing.cpp @@ -45,19 +45,21 @@ void SurfaceTracing::mainLoop() { } void SurfaceTracing::addFirstEntry() { + const auto displayDevice = mFlinger.getDefaultDisplayDevice(); LayersTraceProto entry; { std::scoped_lock lock(mSfLock); - entry = traceLayersLocked("tracing.enable"); + entry = traceLayersLocked("tracing.enable", displayDevice); } addTraceToBuffer(entry); } LayersTraceProto SurfaceTracing::traceWhenNotified() { + const auto displayDevice = mFlinger.getDefaultDisplayDevice(); std::unique_lock<std::mutex> lock(mSfLock); mCanStartTrace.wait(lock); android::base::ScopedLockAssertion assumeLock(mSfLock); - LayersTraceProto entry = traceLayersLocked(mWhere); + LayersTraceProto entry = traceLayersLocked(mWhere, displayDevice); lock.unlock(); return entry; } @@ -160,13 +162,14 @@ void SurfaceTracing::setTraceFlags(uint32_t flags) { mTraceFlags = flags; } -LayersTraceProto SurfaceTracing::traceLayersLocked(const char* where) { +LayersTraceProto SurfaceTracing::traceLayersLocked(const char* where, + const sp<const DisplayDevice>& displayDevice) { ATRACE_CALL(); LayersTraceProto entry; entry.set_elapsed_realtime_nanos(elapsedRealtimeNano()); entry.set_where(where); - LayersProto layers(mFlinger.dumpDrawingStateProto(mTraceFlags)); + LayersProto layers(mFlinger.dumpDrawingStateProto(mTraceFlags, displayDevice)); mFlinger.dumpOffscreenLayersProto(layers); entry.mutable_layers()->Swap(&layers); diff --git a/services/surfaceflinger/SurfaceTracing.h b/services/surfaceflinger/SurfaceTracing.h index 3c24881d7c..4b9f7778ed 100644 --- a/services/surfaceflinger/SurfaceTracing.h +++ b/services/surfaceflinger/SurfaceTracing.h @@ -16,17 +16,19 @@ #pragma once +#include <android-base/thread_annotations.h> #include <layerproto/LayerProtoHeader.h> #include <utils/Errors.h> #include <utils/StrongPointer.h> -#include <android-base/thread_annotations.h> #include <condition_variable> #include <memory> #include <mutex> #include <queue> #include <thread> +#include "DisplayDevice.h" + using namespace android::surfaceflinger; namespace android { @@ -85,13 +87,15 @@ private: void mainLoop(); void addFirstEntry(); LayersTraceProto traceWhenNotified(); - LayersTraceProto traceLayersLocked(const char* where) REQUIRES(mSfLock); + LayersTraceProto traceLayersLocked(const char* where, + const sp<const DisplayDevice>& displayDevice) + REQUIRES(mSfLock); // Returns true if trace is enabled. bool addTraceToBuffer(LayersTraceProto& entry); void writeProtoFileLocked() REQUIRES(mTraceLock); - const SurfaceFlinger& mFlinger; + SurfaceFlinger& mFlinger; status_t mLastErr = NO_ERROR; std::thread mThread; std::condition_variable mCanStartTrace; |