summaryrefslogtreecommitdiff
path: root/transport/HidlTransportSupport.cpp
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2019-03-11 23:09:23 -0700
committerXin Li <delphij@google.com>2019-03-11 23:09:23 -0700
commit4cf9c3b1a3f712df12390a3d036ab554b37d9ed3 (patch)
tree1efd71788b4b93f58f81cfff6b9456cdeb1780f3 /transport/HidlTransportSupport.cpp
parenteda1f923a4d9199a98e20e408c9e904b8a552825 (diff)
parent256d3fce82b61c0106cffcdc6cfd29030d873187 (diff)
downloadlibhidl-4cf9c3b1a3f712df12390a3d036ab554b37d9ed3.tar.gz
DO NOT MERGE - Merge PPRL.190305.001 into master
Bug: 127812889 Change-Id: I13211edda50c7c94a53e7c6d8ed9637235fe1026
Diffstat (limited to 'transport/HidlTransportSupport.cpp')
-rw-r--r--transport/HidlTransportSupport.cpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
index c9937f1..311504d 100644
--- a/transport/HidlTransportSupport.cpp
+++ b/transport/HidlTransportSupport.cpp
@@ -42,7 +42,24 @@ status_t handleTransportPoll(int /*fd*/) {
return handleBinderPoll();
}
-bool setMinSchedulerPolicy(const sp<IBase>& service, int policy, int priority) {
+// TODO(b/122472540): only store one data item per object
+template <typename V>
+static void pruneMapLocked(ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, V>& map) {
+ using ::android::hidl::base::V1_0::IBase;
+
+ std::vector<wp<IBase>> toDelete;
+ for (const auto& kv : map) {
+ if (kv.first.promote() == nullptr) {
+ toDelete.push_back(kv.first);
+ }
+ }
+ for (const auto& k : toDelete) {
+ map.eraseLocked(k);
+ }
+}
+
+bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service,
+ int policy, int priority) {
if (service->isRemote()) {
LOG(ERROR) << "Can't set scheduler policy on remote service.";
return false;
@@ -89,6 +106,22 @@ bool setMinSchedulerPolicy(const sp<IBase>& service, int policy, int priority) {
return true;
}
+bool setRequestingSid(const sp<::android::hidl::base::V1_0::IBase>& service, bool requesting) {
+ if (service->isRemote()) {
+ ALOGE("Can't set requesting sid on remote service.");
+ return false;
+ }
+
+ // 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.
+ std::unique_lock<std::mutex> lock = details::gServiceSidMap.lock();
+ pruneMapLocked(details::gServiceSidMap);
+ details::gServiceSidMap.setLocked(service, requesting);
+
+ return true;
+}
+
bool interfacesEqual(const sp<IBase>& left, const sp<IBase>& right) {
if (left == nullptr || right == nullptr || !left->isRemote() || !right->isRemote()) {
return left == right;