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

Commit 7309cbe0 authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Automerger Merge Worker
Browse files

Merge "Additional lock to avoid access to deleted object." into rvc-dev am:...

Merge "Additional lock to avoid access to deleted object." into rvc-dev am: 28d12368 am: f488b8f8

Change-Id: Ic7ad53e45de92231bca731d3f7b4ee55a0477c00
parents 77957672 f488b8f8
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -1670,9 +1670,15 @@ IncrementalService::DataLoaderStub::~DataLoaderStub() = default;

void IncrementalService::DataLoaderStub::cleanupResources() {
    requestDestroy();

    auto now = Clock::now();

    std::unique_lock lock(mMutex);
    mParams = {};
    mControl = {};
    waitForStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED, std::chrono::seconds(60));
    mStatusCondition.wait_until(lock, now + 60s, [this] {
        return mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
    });
    mListener = {};
    mId = kInvalidStorageId;
}
@@ -1706,7 +1712,7 @@ bool IncrementalService::DataLoaderStub::requestDestroy() {
bool IncrementalService::DataLoaderStub::setTargetStatus(int newStatus) {
    int oldStatus, curStatus;
    {
        std::unique_lock lock(mStatusMutex);
        std::unique_lock lock(mMutex);
        oldStatus = mTargetStatus;
        curStatus = mCurrentStatus;
        setTargetStatusLocked(newStatus);
@@ -1721,13 +1727,6 @@ void IncrementalService::DataLoaderStub::setTargetStatusLocked(int status) {
    mTargetStatusTs = Clock::now();
}

bool IncrementalService::DataLoaderStub::waitForStatus(int status, Clock::duration duration) {
    auto now = Clock::now();
    std::unique_lock lock(mStatusMutex);
    return mStatusCondition.wait_until(lock, now + duration,
                                       [this, status] { return mCurrentStatus == status; });
}

bool IncrementalService::DataLoaderStub::bind() {
    bool result = false;
    auto status = mService.mDataLoaderManager->bindToDataLoader(mId, mParams, this, &result);
@@ -1776,7 +1775,7 @@ bool IncrementalService::DataLoaderStub::fsmStep() {
    int currentStatus;
    int targetStatus;
    {
        std::unique_lock lock(mStatusMutex);
        std::unique_lock lock(mMutex);
        currentStatus = mCurrentStatus;
        targetStatus = mTargetStatus;
    }
@@ -1828,8 +1827,9 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount
    }

    int targetStatus, oldStatus;
    DataLoaderStatusListener listener;
    {
        std::unique_lock lock(mStatusMutex);
        std::unique_lock lock(mMutex);
        if (mCurrentStatus == newStatus) {
            return binder::Status::ok();
        }
@@ -1838,6 +1838,8 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount
        mCurrentStatus = newStatus;
        targetStatus = mTargetStatus;

        listener = mListener;

        if (mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE) {
            // For unavailable, reset target status.
            setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
@@ -1847,8 +1849,8 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount
    LOG(DEBUG) << "Current status update for DataLoader " << mId << ": " << oldStatus << " -> "
               << newStatus << " (target " << targetStatus << ")";

    if (mListener) {
        mListener->onStatusChanged(mountId, newStatus);
    if (listener) {
        listener->onStatusChanged(mountId, newStatus);
    }

    fsmStep();
+2 −2
Original line number Diff line number Diff line
@@ -188,17 +188,17 @@ private:

        bool setTargetStatus(int status);
        void setTargetStatusLocked(int status);
        bool waitForStatus(int status, Clock::duration duration);

        bool fsmStep();

        IncrementalService& mService;

        std::mutex mMutex;
        MountId mId = kInvalidStorageId;
        content::pm::DataLoaderParamsParcel mParams;
        content::pm::FileSystemControlParcel mControl;
        DataLoaderStatusListener mListener;

        std::mutex mStatusMutex;
        std::condition_variable mStatusCondition;
        int mCurrentStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
        int mTargetStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;