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

Commit 321f53fb authored by Patrick Williams's avatar Patrick Williams Committed by Android (Google) Code Review
Browse files

Merge "SF: Trigger ANR when buffer cache is full"

parents d4b27376 f1e5df1d
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -167,14 +167,15 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, bool updateDestinati
    mNumFrameAvailable = 0;

    TransactionCompletedListener::getInstance()->addQueueStallListener(
        [&]() {
            std::function<void(bool)> callbackCopy;
            [&](const std::string& reason) {
                std::function<void(const std::string&)> callbackCopy;
                {
                    std::unique_lock _lock{mMutex};
                    callbackCopy = mTransactionHangCallback;
                }
            if (callbackCopy) callbackCopy(true);
        }, this);
                if (callbackCopy) callbackCopy(reason);
            },
            this);

    BQA_LOGV("BLASTBufferQueue created");
}
@@ -1114,7 +1115,8 @@ bool BLASTBufferQueue::isSameSurfaceControl(const sp<SurfaceControl>& surfaceCon
    return SurfaceControl::isSameSurface(mSurfaceControl, surfaceControl);
}

void BLASTBufferQueue::setTransactionHangCallback(std::function<void(bool)> callback) {
void BLASTBufferQueue::setTransactionHangCallback(
        std::function<void(const std::string&)> callback) {
    std::unique_lock _lock{mMutex};
    mTransactionHangCallback = callback;
}
+9 −7
Original line number Diff line number Diff line
@@ -290,15 +290,17 @@ public:

    void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence,
                         uint32_t currentMaxAcquiredBufferCount) override {
        callRemoteAsync<decltype(
                &ITransactionCompletedListener::onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER,
                                                                  callbackId, releaseFence,
        callRemoteAsync<decltype(&ITransactionCompletedListener::
                                         onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, callbackId,
                                                           releaseFence,
                                                           currentMaxAcquiredBufferCount);
    }

    void onTransactionQueueStalled() override {
        callRemoteAsync<decltype(&ITransactionCompletedListener::onTransactionQueueStalled)>(
            Tag::ON_TRANSACTION_QUEUE_STALLED);
    void onTransactionQueueStalled(const String8& reason) override {
        callRemoteAsync<
                decltype(&ITransactionCompletedListener::
                                 onTransactionQueueStalled)>(Tag::ON_TRANSACTION_QUEUE_STALLED,
                                                             reason);
    }
};

+15 −14
Original line number Diff line number Diff line
@@ -456,22 +456,23 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener
    }
}

void TransactionCompletedListener::onTransactionQueueStalled() {
      std::unordered_map<void*, std::function<void()>> callbackCopy;
void TransactionCompletedListener::onTransactionQueueStalled(const String8& reason) {
    std::unordered_map<void*, std::function<void(const std::string&)>> callbackCopy;
    {
        std::scoped_lock<std::mutex> lock(mMutex);
        callbackCopy = mQueueStallListeners;
    }
    for (auto const& it : callbackCopy) {
          it.second();
        it.second(reason.c_str());
    }
}

void TransactionCompletedListener::addQueueStallListener(std::function<void()> stallListener,
                                                         void* id) {
void TransactionCompletedListener::addQueueStallListener(
        std::function<void(const std::string&)> stallListener, void* id) {
    std::scoped_lock<std::mutex> lock(mMutex);
    mQueueStallListeners[id] = stallListener;
}

void TransactionCompletedListener::removeQueueStallListener(void* id) {
    std::scoped_lock<std::mutex> lock(mMutex);
    mQueueStallListeners.erase(id);
+4 −6
Original line number Diff line number Diff line
@@ -113,12 +113,10 @@ public:
    uint64_t getLastAcquiredFrameNum();

    /**
     * Set a callback to be invoked when we are hung. The boolean parameter
     * indicates whether the hang is due to an unfired fence.
     * TODO: The boolean is always true atm, unfired fence is
     * the only case we detect.
     * Set a callback to be invoked when we are hung. The string parameter
     * indicates the reason for the hang.
     */
    void setTransactionHangCallback(std::function<void(bool)> callback);
    void setTransactionHangCallback(std::function<void(const std::string&)> callback);

    virtual ~BLASTBufferQueue();

@@ -282,7 +280,7 @@ private:
    bool mAppliedLastTransaction = false;
    uint64_t mLastAppliedFrameNumber = 0;

    std::function<void(bool)> mTransactionHangCallback;
    std::function<void(const std::string&)> mTransactionHangCallback;

    std::unordered_set<uint64_t> mSyncedFrameNumbers GUARDED_BY(mMutex);
};
+2 −1
Original line number Diff line number Diff line
@@ -194,7 +194,8 @@ public:

    virtual void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence,
                                 uint32_t currentMaxAcquiredBufferCount) = 0;
    virtual void onTransactionQueueStalled() = 0;

    virtual void onTransactionQueueStalled(const String8& name) = 0;
};

class BnTransactionCompletedListener : public SafeBnInterface<ITransactionCompletedListener> {
Loading