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

Commit fa422e8d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Cleaning up resources on mount destruction." into rvc-dev am: 4e169153

Change-Id: Iec575caccad04d0d70f380ccecb7083893b31276
parents 4eba51ee 4e169153
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -109,9 +109,7 @@ public abstract class DataLoaderService extends Service {
                @NonNull IDataLoaderStatusListener listener)
                throws RuntimeException {
            try {
                if (!nativeCreateDataLoader(id, control, params, listener)) {
                    Slog.e(TAG, "Failed to create native loader for " + id);
                }
                nativeCreateDataLoader(id, control, params, listener);
            } catch (Exception ex) {
                Slog.e(TAG, "Failed to create native loader for " + id, ex);
                destroy(id);
+26 −10
Original line number Diff line number Diff line
@@ -160,8 +160,8 @@ const bool IncrementalService::sEnablePerfLogging =

IncrementalService::IncFsMount::~IncFsMount() {
    if (dataLoaderStub) {
        dataLoaderStub->requestDestroy();
        dataLoaderStub->waitForDestroy();
        dataLoaderStub->cleanupResources();
        dataLoaderStub = {};
    }
    LOG(INFO) << "Unmounting and cleaning up mount " << mountId << " with root '" << root << '\'';
    for (auto&& [target, _] : bindPoints) {
@@ -999,7 +999,8 @@ bool IncrementalService::startLoading(StorageId storage) const {
            return false;
        }
    }
    return dataLoaderStub->requestStart();
    dataLoaderStub->requestStart();
    return true;
}

void IncrementalService::mountExistingImages() {
@@ -1466,11 +1467,17 @@ IncrementalService::DataLoaderStub::DataLoaderStub(IncrementalService& service,
        mParams(std::move(params)),
        mControl(std::move(control)),
        mListener(externalListener ? *externalListener : DataLoaderStatusListener()) {
    //
}

IncrementalService::DataLoaderStub::~DataLoaderStub() {
    waitForDestroy();
IncrementalService::DataLoaderStub::~DataLoaderStub() = default;

void IncrementalService::DataLoaderStub::cleanupResources() {
    requestDestroy();
    mParams = {};
    mControl = {};
    waitForStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED, std::chrono::seconds(60));
    mListener = {};
    mId = kInvalidStorageId;
}

bool IncrementalService::DataLoaderStub::requestCreate() {
@@ -1485,10 +1492,6 @@ bool IncrementalService::DataLoaderStub::requestDestroy() {
    return setTargetStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
}

bool IncrementalService::DataLoaderStub::waitForDestroy(Clock::duration duration) {
    return waitForStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED, duration);
}

bool IncrementalService::DataLoaderStub::setTargetStatus(int status) {
    {
        std::unique_lock lock(mStatusMutex);
@@ -1541,6 +1544,10 @@ bool IncrementalService::DataLoaderStub::destroy() {
}

bool IncrementalService::DataLoaderStub::fsmStep() {
    if (!isValid()) {
        return false;
    }

    int currentStatus;
    int targetStatus;
    {
@@ -1580,6 +1587,15 @@ bool IncrementalService::DataLoaderStub::fsmStep() {
}

binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mountId, int newStatus) {
    if (!isValid()) {
        return binder::Status::
                fromServiceSpecificError(-EINVAL, "onStatusChange came to invalid DataLoaderStub");
    }
    if (mId != mountId) {
        LOG(ERROR) << "Mount ID mismatch: expected " << mId << ", but got: " << mountId;
        return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch.");
    }

    {
        std::unique_lock lock(mStatusMutex);
        if (mCurrentStatus == newStatus) {
+9 −6
Original line number Diff line number Diff line
@@ -173,13 +173,14 @@ private:
                       FileSystemControlParcel&& control,
                       const DataLoaderStatusListener* externalListener);
        ~DataLoaderStub();
        // Cleans up the internal state and invalidates DataLoaderStub. Any subsequent calls will
        // result in an error.
        void cleanupResources();

        bool requestCreate();
        bool requestStart();
        bool requestDestroy();

        bool waitForDestroy(Clock::duration duration = std::chrono::seconds(60));

        void onDump(int fd);

        MountId id() const { return mId; }
@@ -188,6 +189,8 @@ private:
    private:
        binder::Status onStatusChanged(MountId mount, int newStatus) final;

        bool isValid() const { return mId != kInvalidStorageId; }

        bool create();
        bool start();
        bool destroy();
@@ -198,10 +201,10 @@ private:
        bool fsmStep();

        IncrementalService& mService;
        MountId const mId;
        DataLoaderParamsParcel const mParams;
        FileSystemControlParcel const mControl;
        DataLoaderStatusListener const mListener;
        MountId mId = kInvalidStorageId;
        DataLoaderParamsParcel mParams;
        FileSystemControlParcel mControl;
        DataLoaderStatusListener mListener;

        std::mutex mStatusMutex;
        std::condition_variable mStatusCondition;