Commit 3c78cf97 authored by Daniel Nicoara's avatar Daniel Nicoara Committed by Commit Bot

Change the Webview gRPC service handler to take in the service and CQ

Rather than start a new service, allow the caller to re-use an existing
connection. In this model, the caller is responsible for initializing
the service and a completion queue the async Webview service would be
using to execute tasks.

BUG=b/132811925
TEST=Compiled

Change-Id: I7e7cdffdccc6f9e7282a1b952e2e5d8013a93be3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1804556
Commit-Queue: Daniel Nicoara <dnicoara@chromium.org>
Reviewed-by: default avatarAlex Sakhartchouk <alexst@chromium.org>
Cr-Commit-Position: refs/heads/master@{#696890}
parent a2a0d278
......@@ -233,28 +233,17 @@ void WebviewRpcInstance::OnError(const std::string& error_message) {
} // namespace
WebviewAsyncService::WebviewAsyncService(
scoped_refptr<base::SingleThreadTaskRunner> webview_task_runner)
: webview_task_runner_(std::move(webview_task_runner)) {}
WebviewAsyncService::~WebviewAsyncService() {
if (server_) {
server_->Shutdown();
cq_->Shutdown();
base::PlatformThread::Join(rpc_thread_);
}
std::unique_ptr<webview::WebviewService::AsyncService> service,
std::unique_ptr<grpc::ServerCompletionQueue> cq,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
: ui_task_runner_(std::move(ui_task_runner)),
cq_(std::move(cq)),
service_(std::move(service)) {
base::PlatformThread::Create(0, this, &rpc_thread_);
}
void WebviewAsyncService::StartWithSocket(const base::FilePath& socket_path) {
DCHECK(!server_.get());
grpc::ServerBuilder builder;
builder.AddListeningPort("unix:" + socket_path.value(),
grpc::InsecureServerCredentials());
builder.RegisterService(&service_);
cq_ = builder.AddCompletionQueue();
server_ = builder.BuildAndStart();
base::PlatformThread::Create(0, this, &rpc_thread_);
WebviewAsyncService::~WebviewAsyncService() {
base::PlatformThread::Join(rpc_thread_);
}
void WebviewAsyncService::ThreadMain() {
......@@ -263,7 +252,7 @@ void WebviewAsyncService::ThreadMain() {
void* tag;
bool ok;
// This self-deletes.
new WebviewRpcInstance(&service_, cq_.get(), webview_task_runner_);
new WebviewRpcInstance(service_.get(), cq_.get(), ui_task_runner_);
// This thread is joined when this service is destroyed.
while (cq_->Next(&tag, &ok)) {
reinterpret_cast<GrpcCallback*>(tag)->Run(ok);
......
......@@ -19,21 +19,24 @@ namespace chromecast {
// webviews. See the proto file for commands.
class WebviewAsyncService : public base::PlatformThread::Delegate {
public:
explicit WebviewAsyncService(
scoped_refptr<base::SingleThreadTaskRunner> webview_task_runner);
WebviewAsyncService(
std::unique_ptr<webview::WebviewService::AsyncService> service,
std::unique_ptr<grpc::ServerCompletionQueue> cq,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
~WebviewAsyncService() override;
// Start the server listening on an address, eg "localhost:12345".
void StartWithSocket(const base::FilePath& socket_path);
private:
void ThreadMain() override;
// Separate thread to run the gRPC completion queue on.
base::PlatformThreadHandle rpc_thread_;
scoped_refptr<base::SingleThreadTaskRunner> webview_task_runner_;
// Requests need to be posted back to the browser main UI thread to manage
// Webview state.
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
std::unique_ptr<grpc::ServerCompletionQueue> cq_;
webview::WebviewService::AsyncService service_;
std::unique_ptr<grpc::Server> server_;
std::unique_ptr<webview::WebviewService::AsyncService> service_;
DISALLOW_COPY_AND_ASSIGN(WebviewAsyncService);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment