| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "services/service_manager/service_manager.h" | 5 #include "services/service_manager/service_manager.h" | 
| 6 | 6 | 
| 7 #include <stdint.h> | 7 #include <stdint.h> | 
| 8 | 8 | 
| 9 #include <utility> | 9 #include <utility> | 
| 10 | 10 | 
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 139     // Deletes |child|. | 139     // Deletes |child|. | 
| 140     children_.erase(it); | 140     children_.erase(it); | 
| 141   } | 141   } | 
| 142 | 142 | 
| 143   bool ConnectToService(std::unique_ptr<ConnectParams>* connect_params) { | 143   bool ConnectToService(std::unique_ptr<ConnectParams>* connect_params) { | 
| 144     if (!service_.is_bound()) | 144     if (!service_.is_bound()) | 
| 145       return false; | 145       return false; | 
| 146 | 146 | 
| 147     std::unique_ptr<ConnectParams> params(std::move(*connect_params)); | 147     std::unique_ptr<ConnectParams> params(std::move(*connect_params)); | 
| 148     if (!params->connect_callback().is_null()) { | 148     if (!params->connect_callback().is_null()) { | 
| 149         params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, | 149       params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, | 
| 150                                        identity_.user_id()); | 150                                      identity_.user_id()); | 
| 151     } | 151     } | 
| 152 | 152 | 
| 153     InterfaceProviderSpecMap specs; | 153     InterfaceProviderSpecMap specs; | 
| 154     Instance* source = service_manager_->GetExistingInstance(params->source()); | 154     Instance* source = service_manager_->GetExistingInstance(params->source()); | 
| 155     if (source) | 155     if (source) | 
| 156       specs = source->interface_provider_specs_; | 156       specs = source->interface_provider_specs_; | 
| 157 | 157 | 
| 158     pending_service_connections_++; | 158     pending_service_connections_++; | 
| 159     service_->OnConnect(ServiceInfo(params->source(), specs), | 159     service_->OnConnect(ServiceInfo(params->source(), specs), | 
| 160                         params->TakeRemoteInterfaces(), | 160                         params->TakeRemoteInterfaces(), | 
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 630   mojom::Resolver* resolver = resolver_ptr.get(); | 630   mojom::Resolver* resolver = resolver_ptr.get(); | 
| 631   identity_to_resolver_[identity] = std::move(resolver_ptr); | 631   identity_to_resolver_[identity] = std::move(resolver_ptr); | 
| 632   return resolver; | 632   return resolver; | 
| 633 } | 633 } | 
| 634 | 634 | 
| 635 void ServiceManager::OnInstanceError(Instance* instance) { | 635 void ServiceManager::OnInstanceError(Instance* instance) { | 
| 636   // We never clean up the ServiceManager's own instance. | 636   // We never clean up the ServiceManager's own instance. | 
| 637   if (instance == service_manager_instance_) | 637   if (instance == service_manager_instance_) | 
| 638     return; | 638     return; | 
| 639 | 639 | 
| 640   const Identity identity = instance->identity(); | 640   EraseInstanceIdentity(instance); | 
| 641   identity_to_instance_.erase(identity); |  | 
| 642 |  | 
| 643   if (instance->parent()) { | 641   if (instance->parent()) { | 
| 644     // Deletes |instance|. | 642     // Deletes |instance|. | 
| 645     instance->parent()->RemoveChild(instance); | 643     instance->parent()->RemoveChild(instance); | 
| 646   } else { | 644   } else { | 
| 647     auto it = root_instances_.find(instance); | 645     auto it = root_instances_.find(instance); | 
| 648     DCHECK(it != root_instances_.end()); | 646     DCHECK(it != root_instances_.end()); | 
| 649 | 647 | 
| 650     // Deletes |instance|. | 648     // Deletes |instance|. | 
| 651     root_instances_.erase(it); | 649     root_instances_.erase(it); | 
| 652   } | 650   } | 
| 653 } | 651 } | 
| 654 | 652 | 
| 655 void ServiceManager::OnInstanceUnreachable(Instance* instance) { | 653 void ServiceManager::OnInstanceUnreachable(Instance* instance) { | 
| 656   // If an Instance becomes unreachable, new connection requests for this | 654   // If an Instance becomes unreachable, new connection requests for this | 
| 657   // identity will elicit a new Instance instantiation. The unreachable instance | 655   // identity will elicit a new Instance instantiation. The unreachable instance | 
| 658   // remains alive. | 656   // remains alive. | 
| 659   identity_to_instance_.erase(instance->identity()); | 657   EraseInstanceIdentity(instance); | 
| 660 } | 658 } | 
| 661 | 659 | 
| 662 void ServiceManager::OnInstanceStopped(const Identity& identity) { | 660 void ServiceManager::OnInstanceStopped(const Identity& identity) { | 
| 663   listeners_.ForAllPtrs([identity](mojom::ServiceManagerListener* listener) { | 661   listeners_.ForAllPtrs([identity](mojom::ServiceManagerListener* listener) { | 
| 664     listener->OnServiceStopped(identity); | 662     listener->OnServiceStopped(identity); | 
| 665   }); | 663   }); | 
| 666   if (!instance_quit_callback_.is_null()) | 664   if (!instance_quit_callback_.is_null()) | 
| 667     instance_quit_callback_.Run(identity); | 665     instance_quit_callback_.Run(identity); | 
| 668 } | 666 } | 
| 669 | 667 | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 708     for (auto entry : identity_to_instance_) { | 706     for (auto entry : identity_to_instance_) { | 
| 709       if (entry.first.name() == identity.name() && | 707       if (entry.first.name() == identity.name() && | 
| 710           entry.first.instance() == identity.instance()) { | 708           entry.first.instance() == identity.instance()) { | 
| 711         return entry.second; | 709         return entry.second; | 
| 712       } | 710       } | 
| 713     } | 711     } | 
| 714   } | 712   } | 
| 715   return nullptr; | 713   return nullptr; | 
| 716 } | 714 } | 
| 717 | 715 | 
|  | 716 void ServiceManager::EraseInstanceIdentity(Instance* instance) { | 
|  | 717   const Identity& identity = instance->identity(); | 
|  | 718 | 
|  | 719   auto it = identity_to_instance_.find(identity); | 
|  | 720   if (it != identity_to_instance_.end()) { | 
|  | 721     identity_to_instance_.erase(it); | 
|  | 722     return; | 
|  | 723   } | 
|  | 724 | 
|  | 725   if (singletons_.find(identity.name()) != singletons_.end()) { | 
|  | 726     singletons_.erase(identity.name()); | 
|  | 727     for (auto it = identity_to_instance_.begin(); | 
|  | 728          it != identity_to_instance_.end(); ++it) { | 
|  | 729       if (it->first.name() == identity.name() && | 
|  | 730           it->first.instance() == identity.instance()) { | 
|  | 731         identity_to_instance_.erase(it); | 
|  | 732         return; | 
|  | 733       } | 
|  | 734     } | 
|  | 735   } | 
|  | 736 } | 
|  | 737 | 
| 718 void ServiceManager::NotifyServiceStarted(const Identity& identity, | 738 void ServiceManager::NotifyServiceStarted(const Identity& identity, | 
| 719                                           base::ProcessId pid) { | 739                                           base::ProcessId pid) { | 
| 720   listeners_.ForAllPtrs( | 740   listeners_.ForAllPtrs( | 
| 721       [identity, pid](mojom::ServiceManagerListener* listener) { | 741       [identity, pid](mojom::ServiceManagerListener* listener) { | 
| 722         listener->OnServiceStarted(identity, pid); | 742         listener->OnServiceStarted(identity, pid); | 
| 723       }); | 743       }); | 
| 724 } | 744 } | 
| 725 | 745 | 
| 726 void ServiceManager::NotifyServiceFailedToStart(const Identity& identity) { | 746 void ServiceManager::NotifyServiceFailedToStart(const Identity& identity) { | 
| 727   listeners_.ForAllPtrs( | 747   listeners_.ForAllPtrs( | 
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 936   // Now that the instance has a Service, we can connect to it. | 956   // Now that the instance has a Service, we can connect to it. | 
| 937   bool connected = instance->ConnectToService(¶ms); | 957   bool connected = instance->ConnectToService(¶ms); | 
| 938   DCHECK(connected); | 958   DCHECK(connected); | 
| 939 } | 959 } | 
| 940 | 960 | 
| 941 base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() { | 961 base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() { | 
| 942   return weak_ptr_factory_.GetWeakPtr(); | 962   return weak_ptr_factory_.GetWeakPtr(); | 
| 943 } | 963 } | 
| 944 | 964 | 
| 945 }  // namespace service_manager | 965 }  // namespace service_manager | 
| OLD | NEW | 
|---|