diff options
author | Steven Moreland <smoreland@google.com> | 2019-01-07 14:13:07 -0800 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-01-16 18:56:59 +0000 |
commit | 399533d650eff8c1fe9502c1f414f192838234c1 (patch) | |
tree | 5cc3f701952cda6a09d12f2a40500cfc37ff63b9 /transport/HidlTransportSupport.cpp | |
parent | 3f3ff1aca3ec4d17fd0e6a0d3f23108ddcc95134 (diff) | |
download | libhidl-399533d650eff8c1fe9502c1f414f192838234c1.tar.gz |
Add gServiceSidMap.
Like gServicePrioMap. b/122472540 is filed to merge these maps
in the future, but creating a separate map so that it can be easily
backported.
Bug: 121035042
Test: boot and check for SID values for calls into hwservicemanager
coming from clients which called IServiceManager::getService.
Change-Id: I4e5821d91ea694f86911218c23e68fcb987daaf9
Merged-In: I4e5821d91ea694f86911218c23e68fcb987daaf9
(cherry picked from commit d7f8d2226f5c7e98d12137732846e4ba55048927)
Diffstat (limited to 'transport/HidlTransportSupport.cpp')
-rw-r--r-- | transport/HidlTransportSupport.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp index d0871f6..c3a3031 100644 --- a/transport/HidlTransportSupport.cpp +++ b/transport/HidlTransportSupport.cpp @@ -38,6 +38,22 @@ status_t handleTransportPoll(int /*fd*/) { return handleBinderPoll(); } +// 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()) { @@ -63,6 +79,22 @@ bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service 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; +} + namespace details { int32_t getPidIfSharable() { #if LIBHIDL_TARGET_DEBUGGABLE |