diff options
author | Xin Li <delphij@google.com> | 2019-03-11 23:09:23 -0700 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2019-03-11 23:09:23 -0700 |
commit | 4cf9c3b1a3f712df12390a3d036ab554b37d9ed3 (patch) | |
tree | 1efd71788b4b93f58f81cfff6b9456cdeb1780f3 /transport/HidlTransportSupport.cpp | |
parent | eda1f923a4d9199a98e20e408c9e904b8a552825 (diff) | |
parent | 256d3fce82b61c0106cffcdc6cfd29030d873187 (diff) | |
download | libhidl-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.cpp | 35 |
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; |