summaryrefslogtreecommitdiff
path: root/transport/HidlTransportSupport.cpp
diff options
context:
space:
mode:
authorSteven Moreland <smoreland@google.com>2018-07-24 12:18:36 -0700
committerSteven Moreland <smoreland@google.com>2018-08-01 00:02:34 +0000
commit49ccc387e1365cb3bad924a1a2fb832d67bb27b0 (patch)
treec71b7fe29a66d8370c0c817b001eb5f8581b28e9 /transport/HidlTransportSupport.cpp
parent67ed08a0519e01d407e5392265514f1279c170c1 (diff)
downloadlibhidl-49ccc387e1365cb3bad924a1a2fb832d67bb27b0.tar.gz
Have setMinSchedulerPolicy clean itself up.
This cleans up any other entries in the map whenever a new one is added. This API is expected to be called extremely infrequently, so the current solution will only allow a single wp object to be leaked. Fixes: 111192774 Test: boot Change-Id: I740a596978440786dc06c977ba37bf3b1f9017d5
Diffstat (limited to 'transport/HidlTransportSupport.cpp')
-rw-r--r--transport/HidlTransportSupport.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
index d0871f6..9c2bf25 100644
--- a/transport/HidlTransportSupport.cpp
+++ b/transport/HidlTransportSupport.cpp
@@ -58,7 +58,23 @@ bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service
return false;
}
- details::gServicePrioMap.set(service, { policy, priority });
+ // Due to ABI considerations, IBase cannot have a destructor to clean this up.
+ // So, because this API is so infrequently used, (expected to be usually only
+ // one time for a process, but it can be more), we are cleaning it up here.
+ // TODO(b/37794345): if ever we update the HIDL ABI for launches in an Android
+ // release in the meta-version sense, we should remove this.
+ std::unique_lock<std::mutex> lock = details::gServicePrioMap.lock();
+
+ std::vector<wp<::android::hidl::base::V1_0::IBase>> toDelete;
+ for (const auto& kv : details::gServicePrioMap) {
+ if (kv.first.promote() == nullptr) {
+ toDelete.push_back(kv.first);
+ }
+ }
+ for (const auto& k : toDelete) {
+ details::gServicePrioMap.eraseLocked(k);
+ }
+ details::gServicePrioMap.setLocked(service, {policy, priority});
return true;
}