Merge "[incfs] Correctly wait for async .so's extraction" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-04-13 20:21:38 +00:00
committed by Android (Google) Code Review
2 changed files with 28 additions and 8 deletions

View File

@@ -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();
}

View File

@@ -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;