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

Unified Diff: mojo/shell/dynamic_application_loader.cc

Issue 491443005: Get rid of KeepAlive. Quit shell when all urls run directly by Context are closed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Bring back ConnectToServiceViaNetwork Created 6 years, 4 months 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: mojo/shell/dynamic_application_loader.cc
diff --git a/mojo/shell/dynamic_application_loader.cc b/mojo/shell/dynamic_application_loader.cc
index e76fec8dd9107cad942fa319d6c913d1df695663..499527dc5da3943ac4382edcab46515e1a0f7961 100644
--- a/mojo/shell/dynamic_application_loader.cc
+++ b/mojo/shell/dynamic_application_loader.cc
@@ -14,24 +14,12 @@
#include "mojo/common/data_pipe_utils.h"
#include "mojo/services/public/interfaces/network/url_loader.mojom.h"
#include "mojo/shell/context.h"
-#include "mojo/shell/keep_alive.h"
#include "mojo/shell/switches.h"
#include "net/base/filename_util.h"
namespace mojo {
namespace shell {
-namespace {
-
-void RunLibraryComplete(DynamicServiceRunner* runner,
- const base::FilePath& temp_file) {
- delete runner;
- if (!temp_file.empty())
- base::DeleteFile(temp_file, false);
-}
-
-} // namespace
-
DynamicApplicationLoader::DynamicApplicationLoader(
Context* context,
scoped_ptr<DynamicServiceRunnerFactory> runner_factory)
@@ -143,28 +131,40 @@ void DynamicApplicationLoader::RunLibrary(
scoped_refptr<LoadCallbacks> callbacks,
bool delete_file_after,
bool path_exists) {
- // TODO(aa): We need to create a runner, even if we're not going to use it,
- // because it getting destroyed is what causes shell to shut down. If we don't
- // create this, in the case where shell never successfully creates even one
- // app, then shell will never shut down, because no runners are ever
- // destroyed.
- scoped_ptr<DynamicServiceRunner> runner(runner_factory_->Create(context_));
+
+ ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication();
+ if (!shell_handle.is_valid())
+ return;
+
if (!path_exists) {
DVLOG(1) << "Library not started because library path '"
<< path.value() << "' does not exist.";
return;
}
- ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication();
- if (!shell_handle.is_valid())
- return;
+ scoped_ptr<DynamicServiceRunner> runner =
+ runner_factory_->Create(context_).Pass();
+ runner->Start(path,
+ shell_handle.Pass(),
+ base::Bind(&DynamicApplicationLoader::RunLibraryComplete,
+ weak_ptr_factory_.GetWeakPtr(),
+ base::Unretained(runner.get()),
tim (not reviewing) 2014/08/23 00:14:27 Hm. So if I have this right, a DynamicServiceRunne
DaveMoore 2014/08/24 22:31:11 We could if we made TerminateShellConnections bloc
tim (not reviewing) 2014/08/25 16:56:47 Your patch makes it so we won't Quit the shell Mes
+ delete_file_after ? path : base::FilePath()));
+ runners_.push_back(runner.release());
+}
- DynamicServiceRunner* runner_raw = runner.release();
- runner_raw->Start(path,
- shell_handle.Pass(),
- base::Bind(&RunLibraryComplete,
- base::Unretained(runner_raw),
- delete_file_after ? path : base::FilePath()));
+void DynamicApplicationLoader::RunLibraryComplete(
+ DynamicServiceRunner* runner,
+ const base::FilePath& temp_file) {
+ for (ScopedVector<DynamicServiceRunner>::iterator it = runners_.begin();
+ it != runners_.end(); ++it) {
+ if (*it == runner) {
+ runners_.erase(it);
+ if (!temp_file.empty())
+ base::DeleteFile(temp_file, false);
+ return;
+ }
+ }
}
void DynamicApplicationLoader::OnServiceError(ApplicationManager* manager,

Powered by Google App Engine
This is Rietveld 408576698