@@ -157,12 +157,21 @@ class CppBackendShim : public IServiceManager {
157157
158158class AccessorProvider {
159159public:
160- AccessorProvider (RpcAccessorProvider&& provider) : mProvider (std::move(provider)) {}
161- sp<IBinder> provide (const String16& name) { return mProvider (name); }
160+ AccessorProvider (std::set<std::string>&& instances, RpcAccessorProvider&& provider)
161+ : mInstances (std::move(instances)), mProvider (std::move(provider)) {}
162+ sp<IBinder> provide (const String16& name) {
163+ if (mInstances .count (String8 (name).c_str ()) > 0 ) {
164+ return mProvider (name);
165+ } else {
166+ return nullptr ;
167+ }
168+ }
169+ const std::set<std::string>& instances () { return mInstances ; }
162170
163171private:
164172 AccessorProvider () = delete ;
165173
174+ std::set<std::string> mInstances ;
166175 RpcAccessorProvider mProvider ;
167176};
168177
@@ -318,10 +327,32 @@ sp<IServiceManager> getServiceManagerShimFromAidlServiceManagerForTests(
318327 return sp<CppBackendShim>::make (sp<BackendUnifiedServiceManager>::make (sm));
319328}
320329
321- std::weak_ptr<AccessorProvider> addAccessorProvider (RpcAccessorProvider&& providerCallback) {
330+ // gAccessorProvidersMutex must be locked already
331+ static bool isInstanceProvidedLocked (const std::string& instance) {
332+ return gAccessorProviders .end () !=
333+ std::find_if (gAccessorProviders .begin (), gAccessorProviders .end (),
334+ [&instance](const AccessorProviderEntry& entry) {
335+ return entry.mProvider ->instances ().count (instance) > 0 ;
336+ });
337+ }
338+
339+ std::weak_ptr<AccessorProvider> addAccessorProvider (std::set<std::string>&& instances,
340+ RpcAccessorProvider&& providerCallback) {
341+ if (instances.empty ()) {
342+ ALOGE (" Set of instances is empty! Need a non empty set of instances to provide for." );
343+ return std::weak_ptr<AccessorProvider>();
344+ }
322345 std::lock_guard<std::mutex> lock (gAccessorProvidersMutex );
346+ for (const auto & instance : instances) {
347+ if (isInstanceProvidedLocked (instance)) {
348+ ALOGE (" The instance %s is already provided for by a previously added "
349+ " RpcAccessorProvider." ,
350+ instance.c_str ());
351+ return std::weak_ptr<AccessorProvider>();
352+ }
353+ }
323354 std::shared_ptr<AccessorProvider> provider =
324- std::make_shared<AccessorProvider>(std::move (providerCallback));
355+ std::make_shared<AccessorProvider>(std::move (instances), std::move ( providerCallback));
325356 std::weak_ptr<AccessorProvider> receipt = provider;
326357 gAccessorProviders .push_back (AccessorProviderEntry (std::move (provider)));
327358
@@ -331,8 +362,9 @@ std::weak_ptr<AccessorProvider> addAccessorProvider(RpcAccessorProvider&& provid
331362status_t removeAccessorProvider (std::weak_ptr<AccessorProvider> wProvider) {
332363 std::shared_ptr<AccessorProvider> provider = wProvider.lock ();
333364 if (provider == nullptr ) {
334- ALOGE (" The provider supplied to removeAccessorProvider has already been removed." );
335- return NAME_NOT_FOUND;
365+ ALOGE (" The provider supplied to removeAccessorProvider has already been removed or the "
366+ " argument to this function was nullptr." );
367+ return BAD_VALUE;
336368 }
337369 std::lock_guard<std::mutex> lock (gAccessorProvidersMutex );
338370 size_t sizeBefore = gAccessorProviders .size ();
0 commit comments