summaryrefslogtreecommitdiff
path: root/chromium/blimp/net/thread_pipe_manager.cc
blob: 1363e093b9794796f2fac477080d1b66f4a890c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "blimp/net/thread_pipe_manager.h"

#include "base/location.h"
#include "base/sequenced_task_runner.h"
#include "blimp/net/blimp_message_processor.h"
#include "blimp/net/blimp_message_thread_pipe.h"
#include "blimp/net/browser_connection_handler.h"

namespace blimp {

// IoThreadPipeManager is created on the UI thread, and then used and destroyed
// on the IO thread.
// It works with |connection_handler| to register features on the IO thread,
// and manages IO-thread-side BlimpMessageThreadPipes.
class IoThreadPipeManager {
 public:
  explicit IoThreadPipeManager(BrowserConnectionHandler* connection_handler);
  virtual ~IoThreadPipeManager();

  // Connects message pipes between the specified feature and the network layer,
  // using |incoming_proxy| as the incoming message processor, and connecting
  // |outgoing_pipe| to the actual message sender.
  void RegisterFeature(BlimpMessage::Type type,
                       std::unique_ptr<BlimpMessageThreadPipe> outgoing_pipe,
                       std::unique_ptr<BlimpMessageProcessor> incoming_proxy);

 private:
  BrowserConnectionHandler* connection_handler_;

  // Container for the feature-specific MessageProcessors.
  // IO-side proxy for sending messages to UI thread.
  std::vector<std::unique_ptr<BlimpMessageProcessor>> incoming_proxies_;

  // Containers for the MessageProcessors used to write feature-specific
  // messages to the network, and the thread-pipe endpoints through which
  // they are used from the UI thread.
  std::vector<std::unique_ptr<BlimpMessageProcessor>>
      outgoing_message_processors_;
  std::vector<std::unique_ptr<BlimpMessageThreadPipe>> outgoing_pipes_;

  DISALLOW_COPY_AND_ASSIGN(IoThreadPipeManager);
};

IoThreadPipeManager::IoThreadPipeManager(
    BrowserConnectionHandler* connection_handler)
    : connection_handler_(connection_handler) {
  DCHECK(connection_handler_);
}

IoThreadPipeManager::~IoThreadPipeManager() {}

void IoThreadPipeManager::RegisterFeature(
    BlimpMessage::Type type,
    std::unique_ptr<BlimpMessageThreadPipe> outgoing_pipe,
    std::unique_ptr<BlimpMessageProcessor> incoming_proxy) {
  // Registers |incoming_proxy| as the message processor for incoming
  // messages with |type|. Sets the returned outgoing message processor as the
  // target of the |outgoing_pipe|.
  std::unique_ptr<BlimpMessageProcessor> outgoing_message_processor =
      connection_handler_->RegisterFeature(type, incoming_proxy.get());
  outgoing_pipe->set_target_processor(outgoing_message_processor.get());

  // This object manages the lifetimes of the pipe, proxy and target processor.
  incoming_proxies_.push_back(std::move(incoming_proxy));
  outgoing_pipes_.push_back(std::move(outgoing_pipe));
  outgoing_message_processors_.push_back(std::move(outgoing_message_processor));
}

ThreadPipeManager::ThreadPipeManager(
    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner,
    const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner,
    BrowserConnectionHandler* connection_handler)
    : io_task_runner_(io_task_runner),
      ui_task_runner_(ui_task_runner),
      io_pipe_manager_(new IoThreadPipeManager(connection_handler)) {}

ThreadPipeManager::~ThreadPipeManager() {
  io_task_runner_->DeleteSoon(FROM_HERE, io_pipe_manager_.release());
}

std::unique_ptr<BlimpMessageProcessor> ThreadPipeManager::RegisterFeature(
    BlimpMessage::Type type,
    BlimpMessageProcessor* incoming_processor) {
  // Creates an outgoing pipe and a proxy for forwarding messages
  // from features on the UI thread to network components on the IO thread.
  std::unique_ptr<BlimpMessageThreadPipe> outgoing_pipe(
      new BlimpMessageThreadPipe(io_task_runner_));
  std::unique_ptr<BlimpMessageProcessor> outgoing_proxy =
      outgoing_pipe->CreateProxy();

  // Creates an incoming pipe and a proxy for receiving messages
  // from network components on the IO thread.
  std::unique_ptr<BlimpMessageThreadPipe> incoming_pipe(
      new BlimpMessageThreadPipe(ui_task_runner_));
  incoming_pipe->set_target_processor(incoming_processor);
  std::unique_ptr<BlimpMessageProcessor> incoming_proxy =
      incoming_pipe->CreateProxy();

  // Finishes registration on IO thread.
  io_task_runner_->PostTask(
      FROM_HERE, base::Bind(&IoThreadPipeManager::RegisterFeature,
                            base::Unretained(io_pipe_manager_.get()), type,
                            base::Passed(std::move(outgoing_pipe)),
                            base::Passed(std::move(incoming_proxy))));

  incoming_pipes_.push_back(std::move(incoming_pipe));
  return outgoing_proxy;
}

}  // namespace blimp