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

Commit 721ac4d3 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

[incfs] Correctly wait for async .so's extraction

StorageID for an installation changes as we go from a staging
directory to the final one. That's why the only correct way
of waiting for the extraction to complete is by the whole
MountID, even if later it would cause the call to wait on all
instances of the app.

+ measure the waiting timing

Bug: 153513507
Test: adb install megacity.apk
Change-Id: I83558f155867ae5503719ecb63d591fc969c3995
parent 65a3920a
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -1279,7 +1279,7 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_
        {
            std::lock_guard lock(mJobMutex);
            if (mRunning) {
                auto& existingJobs = mJobQueue[storage];
                auto& existingJobs = mJobQueue[ifs->mountId];
                if (existingJobs.empty()) {
                    existingJobs = std::move(jobQueue);
                } else {
@@ -1369,12 +1369,32 @@ void IncrementalService::extractZipFile(const IfsMountPtr& ifs, ZipArchiveHandle
}

bool IncrementalService::waitForNativeBinariesExtraction(StorageId storage) {
    struct WaitPrinter {
        const Clock::time_point startTs = Clock::now();
        ~WaitPrinter() noexcept {
            if (sEnablePerfLogging) {
                const auto endTs = Clock::now();
                LOG(INFO) << "incfs: waitForNativeBinariesExtraction() complete in "
                          << elapsedMcs(startTs, endTs) << "mcs";
            }
        }
    } waitPrinter;

    MountId mount;
    {
        auto ifs = getIfs(storage);
        if (!ifs) {
            return true;
        }
        mount = ifs->mountId;
    }

    std::unique_lock lock(mJobMutex);
    mJobCondition.wait(lock, [this, storage] {
    mJobCondition.wait(lock, [this, mount] {
        return !mRunning ||
                (mPendingJobsStorage != storage && mJobQueue.find(storage) == mJobQueue.end());
                (mPendingJobsMount != mount && mJobQueue.find(mount) == mJobQueue.end());
    });
    return mPendingJobsStorage != storage && mJobQueue.find(storage) == mJobQueue.end();
    return mRunning;
}

void IncrementalService::runJobProcessing() {
@@ -1386,7 +1406,7 @@ void IncrementalService::runJobProcessing() {
        }

        auto it = mJobQueue.begin();
        mPendingJobsStorage = it->first;
        mPendingJobsMount = it->first;
        auto queue = std::move(it->second);
        mJobQueue.erase(it);
        lock.unlock();
@@ -1396,7 +1416,7 @@ void IncrementalService::runJobProcessing() {
        }

        lock.lock();
        mPendingJobsStorage = kInvalidStorageId;
        mPendingJobsMount = kInvalidStorageId;
        lock.unlock();
        mJobCondition.notify_all();
    }
+2 −2
Original line number Diff line number Diff line
@@ -308,8 +308,8 @@ private:
    StorageId mNextId = 0;

    using Job = std::function<void()>;
    std::unordered_map<StorageId, std::vector<Job>> mJobQueue;
    StorageId mPendingJobsStorage = kInvalidStorageId;
    std::unordered_map<MountId, std::vector<Job>> mJobQueue;
    MountId mPendingJobsMount = kInvalidStorageId;
    std::condition_variable mJobCondition;
    std::mutex mJobMutex;
    std::thread mJobProcessor;