summaryrefslogtreecommitdiff
path: root/transport/HidlTransportSupport.cpp
diff options
context:
space:
mode:
authorSteven Moreland <smoreland@google.com>2019-01-07 14:13:07 -0800
committerandroid-build-team Robot <android-build-team-robot@google.com>2019-01-16 18:56:59 +0000
commit399533d650eff8c1fe9502c1f414f192838234c1 (patch)
tree5cc3f701952cda6a09d12f2a40500cfc37ff63b9 /transport/HidlTransportSupport.cpp
parent3f3ff1aca3ec4d17fd0e6a0d3f23108ddcc95134 (diff)
downloadlibhidl-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.cpp32
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