flutter_flutter/content_handler/application_runner.h
Chinmay Garde b34ab18357
Don’t terminate the runner when it has no more applications. (#5243)
Instead, keep it around to service more requests. There may be a race between runner shutdown and request for new applications.
2018-05-11 17:05:22 -07:00

78 lines
2.4 KiB
C++

// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <memory>
#include <unordered_map>
#include <fuchsia/cpp/component.h>
#include "application.h"
#include "lib/app/cpp/application_context.h"
#include "lib/fidl/cpp/binding_set.h"
#include "lib/fsl/tasks/message_loop.h"
#include "lib/fxl/functional/make_copyable.h"
#include "lib/fxl/macros.h"
namespace flutter {
// Publishes the |component::ApplicationRunner| service and runs applications on
// their own threads.
class ApplicationRunner final : public Application::Delegate,
public component::ApplicationRunner {
public:
ApplicationRunner();
~ApplicationRunner();
private:
struct ActiveApplication {
std::unique_ptr<fsl::Thread> thread;
std::unique_ptr<Application> application;
ActiveApplication(std::pair<std::unique_ptr<fsl::Thread>,
std::unique_ptr<Application>> pair)
: thread(std::move(pair.first)), application(std::move(pair.second)) {}
ActiveApplication() {
if (thread && application) {
thread->TaskRunner()->PostTask(
fxl::MakeCopyable([application = std::move(application)]() mutable {
application.reset();
fsl::MessageLoop::GetCurrent()->PostQuitTask();
}));
thread.reset(); // join
}
}
};
std::unique_ptr<component::ApplicationContext> host_context_;
fidl::BindingSet<component::ApplicationRunner> active_applications_bindings_;
std::unordered_map<const Application*, ActiveApplication>
active_applications_;
// |component::ApplicationRunner|
void StartApplication(component::ApplicationPackage application,
component::ApplicationStartupInfo startup_info,
fidl::InterfaceRequest<component::ApplicationController>
controller) override;
void RegisterApplication(
fidl::InterfaceRequest<component::ApplicationRunner> request);
void UnregisterApplication(const Application* application);
// |Application::Delegate|
void OnApplicationTerminate(const Application* application) override;
void SetupICU();
void SetupGlobalFonts();
FXL_DISALLOW_COPY_AND_ASSIGN(ApplicationRunner);
};
} // namespace flutter