Merge "[incfs] Correctly wait for async .so's extraction" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
ced11b60ad
@@ -1279,7 +1279,7 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_
|
|||||||
{
|
{
|
||||||
std::lock_guard lock(mJobMutex);
|
std::lock_guard lock(mJobMutex);
|
||||||
if (mRunning) {
|
if (mRunning) {
|
||||||
auto& existingJobs = mJobQueue[storage];
|
auto& existingJobs = mJobQueue[ifs->mountId];
|
||||||
if (existingJobs.empty()) {
|
if (existingJobs.empty()) {
|
||||||
existingJobs = std::move(jobQueue);
|
existingJobs = std::move(jobQueue);
|
||||||
} else {
|
} else {
|
||||||
@@ -1369,12 +1369,32 @@ void IncrementalService::extractZipFile(const IfsMountPtr& ifs, ZipArchiveHandle
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool IncrementalService::waitForNativeBinariesExtraction(StorageId storage) {
|
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);
|
std::unique_lock lock(mJobMutex);
|
||||||
mJobCondition.wait(lock, [this, storage] {
|
mJobCondition.wait(lock, [this, mount] {
|
||||||
return !mRunning ||
|
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() {
|
void IncrementalService::runJobProcessing() {
|
||||||
@@ -1386,7 +1406,7 @@ void IncrementalService::runJobProcessing() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto it = mJobQueue.begin();
|
auto it = mJobQueue.begin();
|
||||||
mPendingJobsStorage = it->first;
|
mPendingJobsMount = it->first;
|
||||||
auto queue = std::move(it->second);
|
auto queue = std::move(it->second);
|
||||||
mJobQueue.erase(it);
|
mJobQueue.erase(it);
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
@@ -1396,7 +1416,7 @@ void IncrementalService::runJobProcessing() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lock.lock();
|
lock.lock();
|
||||||
mPendingJobsStorage = kInvalidStorageId;
|
mPendingJobsMount = kInvalidStorageId;
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
mJobCondition.notify_all();
|
mJobCondition.notify_all();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -308,8 +308,8 @@ private:
|
|||||||
StorageId mNextId = 0;
|
StorageId mNextId = 0;
|
||||||
|
|
||||||
using Job = std::function<void()>;
|
using Job = std::function<void()>;
|
||||||
std::unordered_map<StorageId, std::vector<Job>> mJobQueue;
|
std::unordered_map<MountId, std::vector<Job>> mJobQueue;
|
||||||
StorageId mPendingJobsStorage = kInvalidStorageId;
|
MountId mPendingJobsMount = kInvalidStorageId;
|
||||||
std::condition_variable mJobCondition;
|
std::condition_variable mJobCondition;
|
||||||
std::mutex mJobMutex;
|
std::mutex mJobMutex;
|
||||||
std::thread mJobProcessor;
|
std::thread mJobProcessor;
|
||||||
|
|||||||
Reference in New Issue
Block a user