summaryrefslogtreecommitdiff
path: root/cmds/idmap2/idmap2d/Idmap2Service.cpp
diff options
context:
space:
mode:
authorRyan Mitchell <rtmitchell@google.com>2021-07-15 10:43:42 -0700
committerRyan Mitchell <rtmitchell@google.com>2021-07-19 16:53:27 +0000
commitb887f68ad162578241050bb877cd7ae61c4876c8 (patch)
tree3b156ce728ccf33110a79fab075620d8f16a6ae6 /cmds/idmap2/idmap2d/Idmap2Service.cpp
parentb827a8ac8354ad87aed758922291c22ee0504d85 (diff)
Use binder-based iterator to retrieve FRROs
If for some reason there are a lot of fabricated overlays in the resources cache, the binder limit of the list of fabricated overlay infos could exceed the maximum binder transaction size. Rather than return all of the frro infos in one transactions, register an iterator with the native idmap2d service and use multiple binder transactions to iterate through all of the frros. Bug: 192948522 Test: Toggle device theme colors several times and observe frro cache Reboot device and observe old frros are deleted Change-Id: I5e9cf3ae9d1d45eda683c24141a0cd4e4301e02f
Diffstat (limited to 'cmds/idmap2/idmap2d/Idmap2Service.cpp')
-rw-r--r--cmds/idmap2/idmap2d/Idmap2Service.cpp35
1 files changed, 29 insertions, 6 deletions
diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp
index 2cfbac3f2c26..a8d648917b08 100644
--- a/cmds/idmap2/idmap2d/Idmap2Service.cpp
+++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp
@@ -297,17 +297,40 @@ Status Idmap2Service::createFabricatedOverlay(
return ok();
}
-Status Idmap2Service::getFabricatedOverlayInfos(
+Status Idmap2Service::acquireFabricatedOverlayIterator() {
+ if (frro_iter_.has_value()) {
+ LOG(WARNING) << "active ffro iterator was not previously released";
+ }
+ frro_iter_ = std::filesystem::directory_iterator(kIdmapCacheDir);
+ return ok();
+}
+
+Status Idmap2Service::releaseFabricatedOverlayIterator() {
+ if (!frro_iter_.has_value()) {
+ LOG(WARNING) << "no active ffro iterator to release";
+ }
+ return ok();
+}
+
+Status Idmap2Service::nextFabricatedOverlayInfos(
std::vector<os::FabricatedOverlayInfo>* _aidl_return) {
- for (const auto& entry : std::filesystem::directory_iterator(kIdmapCacheDir)) {
- if (!android::IsFabricatedOverlay(entry.path())) {
+ constexpr size_t kMaxEntryCount = 100;
+ if (!frro_iter_.has_value()) {
+ return error("no active frro iterator");
+ }
+
+ size_t count = 0;
+ auto& entry_iter = *frro_iter_;
+ auto entry_iter_end = end(*frro_iter_);
+ for (; entry_iter != entry_iter_end && count < kMaxEntryCount; ++entry_iter) {
+ auto& entry = *entry_iter;
+ if (!entry.is_regular_file() || !android::IsFabricatedOverlay(entry.path())) {
continue;
}
const auto overlay = FabricatedOverlayContainer::FromPath(entry.path());
if (!overlay) {
- // This is a sign something went wrong.
- LOG(ERROR) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage();
+ LOG(WARNING) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage();
continue;
}
@@ -319,8 +342,8 @@ Status Idmap2Service::getFabricatedOverlayInfos(
out_info.targetOverlayable = info.target_name;
out_info.path = entry.path();
_aidl_return->emplace_back(std::move(out_info));
+ count++;
}
-
return ok();
}