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, |