Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(767)

Unified Diff: services/service_manager/tests/lifecycle/package.cc

Issue 2476063002: Service Manager: Rework Service and ServiceContext lifetime (Closed)
Patch Set: . Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/service_manager/tests/lifecycle/package.cc
diff --git a/services/service_manager/tests/lifecycle/package.cc b/services/service_manager/tests/lifecycle/package.cc
index 25dc8a1c8e2a8595a39bd4e4a062b72130ca831a..1be7d9353a3a6f3cccc487d232110f0940867c47 100644
--- a/services/service_manager/tests/lifecycle/package.cc
+++ b/services/service_manager/tests/lifecycle/package.cc
@@ -7,8 +7,11 @@
#include "base/bind.h"
#include "base/macros.h"
+#include "base/memory/ptr_util.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/c/main.h"
+#include "services/service_manager/public/cpp/interface_factory.h"
+#include "services/service_manager/public/cpp/interface_registry.h"
#include "services/service_manager/public/cpp/service_context.h"
#include "services/service_manager/public/cpp/service_runner.h"
#include "services/service_manager/public/interfaces/service_factory.mojom.h"
@@ -17,39 +20,41 @@
namespace {
-class PackagedApp : public service_manager::Service,
- public service_manager::InterfaceFactory<LifecycleControl>,
- public LifecycleControl {
+class PackagedApp
+ : public service_manager::Service,
+ public service_manager::InterfaceFactory<
+ service_manager::test::mojom::LifecycleControl>,
+ public service_manager::test::mojom::LifecycleControl {
public:
- using DestructCallback = base::Callback<void(PackagedApp*)>;
-
PackagedApp(
- service_manager::mojom::ServiceRequest request,
- const DestructCallback& service_manager_connection_closed_callback,
- const DestructCallback& destruct_callback)
- : connection_(
- new service_manager::ServiceContext(this, std::move(request))),
- service_manager_connection_closed_callback_(
+ const base::Closure& service_manager_connection_closed_callback,
+ const base::Closure& destruct_callback)
+ : service_manager_connection_closed_callback_(
service_manager_connection_closed_callback),
destruct_callback_(destruct_callback) {
bindings_.set_connection_error_handler(base::Bind(&PackagedApp::BindingLost,
base::Unretained(this)));
}
- ~PackagedApp() override {
- destruct_callback_.Run(this);
- }
+
+ ~PackagedApp() override {}
private:
// service_manager::Service:
+ void OnStart(service_manager::ServiceContext* context) override {
+ context_ = context;
+ }
+
bool OnConnect(const service_manager::ServiceInfo& remote_info,
service_manager::InterfaceRegistry* registry) override {
- registry->AddInterface<LifecycleControl>(this);
+ registry->AddInterface<service_manager::test::mojom::LifecycleControl>(
+ this);
return true;
}
// service_manager::InterfaceFactory<LifecycleControl>
- void Create(const service_manager::Identity& remote_identity,
- LifecycleControlRequest request) override {
+ void Create(
+ const service_manager::Identity& remote_identity,
+ service_manager::test::mojom::LifecycleControlRequest request) override {
bindings_.AddBinding(this, std::move(request));
}
@@ -57,35 +62,42 @@ class PackagedApp : public service_manager::Service,
void Ping(const PingCallback& callback) override {
callback.Run();
}
+
void GracefulQuit() override {
- service_manager_connection_closed_callback_.Run(this);
- delete this;
- // This will have closed all |bindings_|.
+ service_manager_connection_closed_callback_.Run();
+
+ // Deletes |this|.
+ destruct_callback_.Run();
}
+
void Crash() override {
// When multiple instances are vended from the same package instance, this
// will cause all instances to be quit.
exit(1);
}
+
void CloseServiceManagerConnection() override {
- service_manager_connection_closed_callback_.Run(this);
- connection_.reset();
+ service_manager_connection_closed_callback_.Run();
+ context_->QuitNow();
// This only closed our relationship with the service manager, existing
// |bindings_|
// remain active.
}
void BindingLost() {
- if (bindings_.empty())
- delete this;
+ if (bindings_.empty()) {
+ // Deletes |this|.
+ destruct_callback_.Run();
+ }
}
- std::unique_ptr<service_manager::ServiceContext> connection_;
- mojo::BindingSet<LifecycleControl> bindings_;
+ service_manager::ServiceContext* context_;
+ mojo::BindingSet<service_manager::test::mojom::LifecycleControl> bindings_;
+
// Run when this object's connection to the service manager is closed.
- DestructCallback service_manager_connection_closed_callback_;
+ base::Closure service_manager_connection_closed_callback_;
// Run when this object is destructed.
- DestructCallback destruct_callback_;
+ base::Closure destruct_callback_;
DISALLOW_COPY_AND_ASSIGN(PackagedApp);
};
@@ -98,12 +110,12 @@ class Package : public service_manager::Service,
Package() {}
~Package() override {}
- void set_runner(service_manager::ServiceRunner* runner) {
- app_client_.set_runner(runner);
+ private:
+ // service_manager::Service:
+ void OnStart(service_manager::ServiceContext* context) override {
+ app_client_.OnStart(context);
}
- private:
- // service_manager::test::AppClient:
bool OnConnect(const service_manager::ServiceInfo& remote_info,
service_manager::InterfaceRegistry* registry) override {
registry->AddInterface<service_manager::mojom::ServiceFactory>(this);
@@ -120,30 +132,48 @@ class Package : public service_manager::Service,
void CreateService(service_manager::mojom::ServiceRequest request,
const std::string& name) override {
++service_manager_connection_refcount_;
- apps_.push_back(new PackagedApp(
- std::move(request),
- base::Bind(&Package::AppServiceManagerConnectionClosed,
- base::Unretained(this)),
- base::Bind(&Package::AppDestructed, base::Unretained(this))));
+ int id = next_id_++;
+ std::unique_ptr<service_manager::ServiceContext> context =
+ base::MakeUnique<service_manager::ServiceContext>(
+ base::MakeUnique<PackagedApp>(
+ base::Bind(&Package::AppServiceManagerConnectionClosed,
+ base::Unretained(this)),
+ base::Bind(&Package::DestroyService, base::Unretained(this),
+ id)),
+ std::move(request));
+ service_manager::ServiceContext* raw_context = context.get();
+ contexts_.insert(std::make_pair(raw_context, std::move(context)));
+ id_to_context_.insert(std::make_pair(id, raw_context));
}
- void AppServiceManagerConnectionClosed(PackagedApp* app) {
+ void AppServiceManagerConnectionClosed() {
if (!--service_manager_connection_refcount_)
app_client_.CloseServiceManagerConnection();
}
- void AppDestructed(PackagedApp* app) {
- auto it = std::find(apps_.begin(), apps_.end(), app);
- DCHECK(it != apps_.end());
- apps_.erase(it);
- if (apps_.empty() && base::MessageLoop::current()->is_running())
+ void DestroyService(int id) {
+ auto id_it = id_to_context_.find(id);
+ DCHECK(id_it != id_to_context_.end());
+
+ auto it = contexts_.find(id_it->second);
+ DCHECK(it != contexts_.end());
+ contexts_.erase(it);
+ id_to_context_.erase(id_it);
+ if (contexts_.empty() && base::MessageLoop::current()->is_running())
base::MessageLoop::current()->QuitWhenIdle();
}
service_manager::test::AppClient app_client_;
int service_manager_connection_refcount_ = 0;
mojo::BindingSet<service_manager::mojom::ServiceFactory> bindings_;
- std::vector<PackagedApp*> apps_;
+
+ using ServiceContextMap =
+ std::map<service_manager::ServiceContext*,
+ std::unique_ptr<service_manager::ServiceContext>>;
+ ServiceContextMap contexts_;
+
+ int next_id_ = 0;
+ std::map<int, service_manager::ServiceContext*> id_to_context_;
DISALLOW_COPY_AND_ASSIGN(Package);
};
@@ -151,8 +181,6 @@ class Package : public service_manager::Service,
} // namespace
MojoResult ServiceMain(MojoHandle service_request_handle) {
- Package* package = new Package;
- service_manager::ServiceRunner runner(package);
- package->set_runner(&runner);
+ service_manager::ServiceRunner runner(new Package);
return runner.Run(service_request_handle);
}
« no previous file with comments | « services/service_manager/tests/lifecycle/lifecycle_unittest.cc ('k') | services/service_manager/tests/lifecycle/parent.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698