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

Commit 50d83ff1 authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Reduce ifs lock scope.

Bug: 182214420
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest PackageManagerServiceTest ChecksumsTest
Change-Id: Ic36002205c93b316b28ba10ea8f5fbc50dcff70a
parent bcb2fe0c
Loading
Loading
Loading
Loading
+47 −26
Original line number Diff line number Diff line
@@ -323,6 +323,14 @@ void IncrementalService::IncFsMount::setReadLogsEnabled(bool value) {
    }
}

void IncrementalService::IncFsMount::setReadLogsRequested(bool value) {
    if (value) {
        flags |= StorageFlags::ReadLogsRequested;
    } else {
        flags &= ~StorageFlags::ReadLogsRequested;
    }
}

IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_view rootDir)
      : mVold(sm.getVoldService()),
        mDataLoaderManager(sm.getDataLoaderManager()),
@@ -804,6 +812,9 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog
        return -EINVAL;
    }

    std::string packageName;

    {
        std::unique_lock l(ifs->lock);
        if (!enableReadLogs) {
            return disableReadLogsLocked(*ifs);
@@ -824,12 +835,15 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog
        const auto now = mClock->now();
        const auto startLoadingTs = ifs->startLoadingTs;
        if (startLoadingTs <= now && now - startLoadingTs > getReadLogsMaxInterval()) {
        LOG(ERROR) << "enableReadLogs failed, readlogs can't be enabled at this time, storageId: "
            LOG(ERROR)
                    << "enableReadLogs failed, readlogs can't be enabled at this time, storageId: "
                    << storageId;
            return -EPERM;
        }

    const auto& packageName = ifs->dataLoaderStub->params().packageName;
        packageName = ifs->dataLoaderStub->params().packageName;
        ifs->setReadLogsRequested(true);
    }

    // Check loader usage stats permission and apop.
    if (auto status =
@@ -849,9 +863,15 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog
        return fromBinderStatus(status);
    }

    {
        std::unique_lock l(ifs->lock);
        if (!ifs->readLogsRequested()) {
            return 0;
        }
        if (auto status = applyStorageParamsLocked(*ifs, /*enableReadLogs=*/true); status != 0) {
            return status;
        }
    }

    registerAppOpsCallback(packageName);

@@ -859,6 +879,7 @@ int IncrementalService::setStorageParams(StorageId storageId, bool enableReadLog
}

int IncrementalService::disableReadLogsLocked(IncFsMount& ifs) {
    ifs.setReadLogsRequested(false);
    return applyStorageParamsLocked(ifs, /*enableReadLogs=*/false);
}

@@ -2214,7 +2235,6 @@ void IncrementalService::onAppOpChanged(const std::string& packageName) {
        affected.reserve(mMounts.size());
        for (auto&& [id, ifs] : mMounts) {
            std::unique_lock ll(ifs->lock);

            if (ifs->mountId == id && ifs->dataLoaderStub &&
                ifs->dataLoaderStub->params().packageName == packageName) {
                affected.push_back(ifs);
@@ -2222,7 +2242,8 @@ void IncrementalService::onAppOpChanged(const std::string& packageName) {
        }
    }
    for (auto&& ifs : affected) {
        applyStorageParamsLocked(*ifs, /*enableReadLogs=*/false);
        std::unique_lock ll(ifs->lock);
        disableReadLogsLocked(*ifs);
    }
}

+4 −0
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ public:
    enum StorageFlags {
        ReadLogsAllowed = 1 << 0,
        ReadLogsEnabled = 1 << 1,
        ReadLogsRequested = 1 << 2,
    };

    struct LoadingProgress {
@@ -365,6 +366,9 @@ private:
        void setReadLogsEnabled(bool value);
        int32_t readLogsEnabled() const { return (flags & StorageFlags::ReadLogsEnabled); }

        void setReadLogsRequested(bool value);
        int32_t readLogsRequested() const { return (flags & StorageFlags::ReadLogsRequested); }

        static void cleanupFilesystem(std::string_view root);
    };