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

Commit 30eaa19a authored by Jim Shargo's avatar Jim Shargo Committed by Android (Google) Code Review
Browse files

Merge "SurfaceComposer: avoid data races by holding lock more" into main

parents 8f5873e2 a3d73dab
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#include <gui/TraceUtils.h>
#include <utils/Errors.h>
#include <utils/Log.h>
#include <utils/Mutex.h>
#include <utils/SortedVector.h>
#include <utils/String8.h>
#include <utils/threads.h>
@@ -2620,6 +2621,7 @@ SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& c

void SurfaceComposerClient::onFirstRef() {
    sp<gui::ISurfaceComposer> sf(ComposerServiceAIDL::getComposerService());
    Mutex::Autolock _lm(mLock);
    if (sf != nullptr && mStatus == NO_INIT) {
        sp<ISurfaceComposerClient> conn;
        binder::Status status = sf->createConnection(&conn);
@@ -2635,10 +2637,12 @@ SurfaceComposerClient::~SurfaceComposerClient() {
}

status_t SurfaceComposerClient::initCheck() const {
    Mutex::Autolock _lm(mLock);
    return mStatus;
}

sp<IBinder> SurfaceComposerClient::connection() const {
    Mutex::Autolock _lm(mLock);
    return IInterface::asBinder(mClient);
}

@@ -2687,6 +2691,7 @@ status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32
                                                     const sp<IBinder>& parentHandle,
                                                     LayerMetadata metadata,
                                                     uint32_t* outTransformHint) {
    Mutex::Autolock _lm(mLock);
    status_t err = mStatus;

    if (mStatus == NO_ERROR) {
@@ -2713,6 +2718,8 @@ sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFr
        return nullptr;
    }

    Mutex::Autolock _lm(mLock);

    sp<IBinder> mirrorFromHandle = mirrorFromSurface->getHandle();
    sp<IBinder> stopAtHandle = stopAt ? stopAt->getHandle() : nullptr;
    gui::CreateSurfaceResult result;
@@ -2726,6 +2733,8 @@ sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFr
}

sp<SurfaceControl> SurfaceComposerClient::mirrorDisplay(DisplayId displayId) {
    Mutex::Autolock _lm(mLock);

    gui::CreateSurfaceResult result;
    const binder::Status status = mClient->mirrorDisplay(displayId.value, &result);
    const status_t err = statusTFromBinderStatus(status);
@@ -2737,6 +2746,8 @@ sp<SurfaceControl> SurfaceComposerClient::mirrorDisplay(DisplayId displayId) {
}

status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
    Mutex::Autolock _lm(mLock);

    if (mStatus != NO_ERROR) {
        return mStatus;
    }
@@ -2746,9 +2757,12 @@ status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) c

status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
    FrameStats* outStats) const {
    Mutex::Autolock _lm(mLock);

    if (mStatus != NO_ERROR) {
        return mStatus;
    }

    gui::FrameStats stats;
    const binder::Status status = mClient->getLayerFrameStats(token, &stats);
    if (status.isOk()) {
+7 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@

#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/Mutex.h>
#include <utils/Singleton.h>
#include <utils/SortedVector.h>
#include <utils/threads.h>
@@ -875,7 +876,10 @@ public:
    static void setDisplayProjection(const sp<IBinder>& token, ui::Rotation orientation,
                                     const Rect& layerStackRect, const Rect& displayRect);

    inline sp<ISurfaceComposerClient> getClient() { return mClient; }
    inline sp<ISurfaceComposerClient> getClient() {
      Mutex::Autolock _lm(mLock);
      return mClient;
    }

    static status_t getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
                                                          ui::PixelFormat* outFormat,
@@ -922,8 +926,8 @@ private:
    virtual void onFirstRef();

    mutable     Mutex                       mLock;
                status_t                    mStatus;
                sp<ISurfaceComposerClient>  mClient;
                status_t                    mStatus GUARDED_BY(mLock);
                sp<ISurfaceComposerClient>  mClient GUARDED_BY(mLock);
};

// ---------------------------------------------------------------------------