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

Side by Side Diff: components/arc/arc_bridge_service.cc

Issue 1548833002: arc-bridge: Restart ARC instance on crash (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: Created 4 years, 12 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/arc/arc_bridge_service.h" 5 #include "components/arc/arc_bridge_service.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/sequenced_task_runner.h" 10 #include "base/sequenced_task_runner.h"
11 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
12 #include "chromeos/chromeos_switches.h" 12 #include "chromeos/chromeos_switches.h"
13 #include "components/arc/arc_bridge_service_impl.h" 13 #include "components/arc/arc_bridge_service_impl.h"
14 14
15 namespace arc { 15 namespace arc {
16 16
17 namespace { 17 namespace {
18 18
19 // Weak pointer. This class is owned by ArcServiceManager. 19 // Weak pointer. This class is owned by ArcServiceManager.
20 ArcBridgeService* g_arc_bridge_service = nullptr; 20 ArcBridgeService* g_arc_bridge_service = nullptr;
21 21
22 } // namespace 22 } // namespace
23 23
24 ArcBridgeService::ArcBridgeService() 24 ArcBridgeService::ArcBridgeService()
25 : available_(false), state_(State::STOPPED) { 25 : available_(false), state_(State::STOPPED), weak_factory_(this) {
26 DCHECK(!g_arc_bridge_service); 26 DCHECK(!g_arc_bridge_service);
27 g_arc_bridge_service = this; 27 g_arc_bridge_service = this;
28 } 28 }
29 29
30 ArcBridgeService::~ArcBridgeService() { 30 ArcBridgeService::~ArcBridgeService() {
31 DCHECK(CalledOnValidThread()); 31 DCHECK(CalledOnValidThread());
32 DCHECK(state() == State::STOPPING || state() == State::STOPPED); 32 DCHECK(state() == State::STOPPING || state() == State::STOPPED);
33 DCHECK(g_arc_bridge_service == this); 33 DCHECK(g_arc_bridge_service == this);
34 g_arc_bridge_service = nullptr; 34 g_arc_bridge_service = nullptr;
35 } 35 }
(...skipping 17 matching lines...) Expand all
53 53
54 void ArcBridgeService::RemoveObserver(Observer* observer) { 54 void ArcBridgeService::RemoveObserver(Observer* observer) {
55 DCHECK(CalledOnValidThread()); 55 DCHECK(CalledOnValidThread());
56 observer_list_.RemoveObserver(observer); 56 observer_list_.RemoveObserver(observer);
57 } 57 }
58 58
59 void ArcBridgeService::OnAppInstanceReady(AppInstancePtr app_ptr) { 59 void ArcBridgeService::OnAppInstanceReady(AppInstancePtr app_ptr) {
60 DCHECK(CalledOnValidThread()); 60 DCHECK(CalledOnValidThread());
61 app_ptr_ = std::move(app_ptr); 61 app_ptr_ = std::move(app_ptr);
62 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceReady()); 62 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceReady());
63 app_ptr_.set_connection_error_handler(base::Bind(
64 &ArcBridgeService::OnAppChannelClosed, weak_factory_.GetWeakPtr()));
65 }
66
67 void ArcBridgeService::OnAppChannelClosed() {
68 DCHECK(CalledOnValidThread());
69 if (!app_ptr_)
70 return;
71
72 app_ptr_.reset();
73 FOR_EACH_OBSERVER(Observer, observer_list(), OnAppInstanceClosed());
63 } 74 }
64 75
65 void ArcBridgeService::OnInputInstanceReady(InputInstancePtr input_ptr) { 76 void ArcBridgeService::OnInputInstanceReady(InputInstancePtr input_ptr) {
66 DCHECK(CalledOnValidThread()); 77 DCHECK(CalledOnValidThread());
67 input_ptr_ = std::move(input_ptr); 78 input_ptr_ = std::move(input_ptr);
68 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceReady()); 79 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceReady());
80 input_ptr_.set_connection_error_handler(base::Bind(
81 &ArcBridgeService::OnInputChannelClosed, weak_factory_.GetWeakPtr()));
82 }
83
84 void ArcBridgeService::OnInputChannelClosed() {
85 DCHECK(CalledOnValidThread());
86 if (!input_ptr_)
87 return;
88
89 input_ptr_.reset();
90 FOR_EACH_OBSERVER(Observer, observer_list(), OnInputInstanceClosed());
69 } 91 }
70 92
71 void ArcBridgeService::OnNotificationsInstanceReady( 93 void ArcBridgeService::OnNotificationsInstanceReady(
72 NotificationsInstancePtr notifications_ptr) { 94 NotificationsInstancePtr notifications_ptr) {
73 DCHECK(CalledOnValidThread()); 95 DCHECK(CalledOnValidThread());
74 notifications_ptr_ = std::move(notifications_ptr); 96 notifications_ptr_ = std::move(notifications_ptr);
75 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceReady()); 97 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceReady());
98 notifications_ptr_.set_connection_error_handler(
99 base::Bind(&ArcBridgeService::OnNotificationsChannelClosed,
100 weak_factory_.GetWeakPtr()));
101 }
102
103 void ArcBridgeService::OnNotificationsChannelClosed() {
104 DCHECK(CalledOnValidThread());
105 if (!notifications_ptr_)
106 return;
107
108 notifications_ptr_.reset();
109 FOR_EACH_OBSERVER(Observer, observer_list(), OnNotificationsInstanceClosed());
76 } 110 }
77 111
78 void ArcBridgeService::OnPowerInstanceReady(PowerInstancePtr power_ptr) { 112 void ArcBridgeService::OnPowerInstanceReady(PowerInstancePtr power_ptr) {
79 DCHECK(CalledOnValidThread()); 113 DCHECK(CalledOnValidThread());
80 power_ptr_ = std::move(power_ptr); 114 power_ptr_ = std::move(power_ptr);
81 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceReady()); 115 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceReady());
116 power_ptr_.set_connection_error_handler(base::Bind(
117 &ArcBridgeService::OnPowerChannelClosed, weak_factory_.GetWeakPtr()));
118 }
119
120 void ArcBridgeService::OnPowerChannelClosed() {
121 DCHECK(CalledOnValidThread());
122 if (!power_ptr_)
123 return;
124
125 power_ptr_.reset();
126 FOR_EACH_OBSERVER(Observer, observer_list(), OnPowerInstanceClosed());
82 } 127 }
83 128
84 void ArcBridgeService::OnProcessInstanceReady(ProcessInstancePtr process_ptr) { 129 void ArcBridgeService::OnProcessInstanceReady(ProcessInstancePtr process_ptr) {
85 DCHECK(CalledOnValidThread()); 130 DCHECK(CalledOnValidThread());
86 process_ptr_ = std::move(process_ptr); 131 process_ptr_ = std::move(process_ptr);
87 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceReady()); 132 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceReady());
133 process_ptr_.set_connection_error_handler(base::Bind(
134 &ArcBridgeService::OnProcessChannelClosed, weak_factory_.GetWeakPtr()));
135 }
136
137 void ArcBridgeService::OnProcessChannelClosed() {
138 DCHECK(CalledOnValidThread());
139 if (!process_ptr_)
140 return;
141
142 process_ptr_.reset();
143 FOR_EACH_OBSERVER(Observer, observer_list(), OnProcessInstanceClosed());
88 } 144 }
89 145
90 void ArcBridgeService::OnSettingsInstanceReady( 146 void ArcBridgeService::OnSettingsInstanceReady(
91 SettingsInstancePtr settings_ptr) { 147 SettingsInstancePtr settings_ptr) {
92 DCHECK(CalledOnValidThread()); 148 DCHECK(CalledOnValidThread());
93 settings_ptr_ = std::move(settings_ptr); 149 settings_ptr_ = std::move(settings_ptr);
94 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceReady()); 150 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceReady());
151 settings_ptr_.set_connection_error_handler(base::Bind(
152 &ArcBridgeService::OnSettingsChannelClosed, weak_factory_.GetWeakPtr()));
153 }
154
155 void ArcBridgeService::OnSettingsChannelClosed() {
156 DCHECK(CalledOnValidThread());
157 if (!settings_ptr_)
158 return;
159
160 settings_ptr_.reset();
161 FOR_EACH_OBSERVER(Observer, observer_list(), OnSettingsInstanceClosed());
95 } 162 }
96 163
97 void ArcBridgeService::SetState(State state) { 164 void ArcBridgeService::SetState(State state) {
98 DCHECK(CalledOnValidThread()); 165 DCHECK(CalledOnValidThread());
99 // DCHECK on enum classes not supported. 166 // DCHECK on enum classes not supported.
100 DCHECK(state_ != state); 167 DCHECK(state_ != state);
101 state_ = state; 168 state_ = state;
102 FOR_EACH_OBSERVER(Observer, observer_list(), OnStateChanged(state_)); 169 FOR_EACH_OBSERVER(Observer, observer_list(), OnStateChanged(state_));
103 } 170 }
104 171
105 void ArcBridgeService::SetAvailable(bool available) { 172 void ArcBridgeService::SetAvailable(bool available) {
106 DCHECK(CalledOnValidThread()); 173 DCHECK(CalledOnValidThread());
107 DCHECK(available_ != available); 174 DCHECK(available_ != available);
108 available_ = available; 175 available_ = available;
109 FOR_EACH_OBSERVER(Observer, observer_list(), OnAvailableChanged(available_)); 176 FOR_EACH_OBSERVER(Observer, observer_list(), OnAvailableChanged(available_));
110 } 177 }
111 178
112 bool ArcBridgeService::CalledOnValidThread() { 179 bool ArcBridgeService::CalledOnValidThread() {
113 return thread_checker_.CalledOnValidThread(); 180 return thread_checker_.CalledOnValidThread();
114 } 181 }
115 182
183 void ArcBridgeService::CloseAllChannels() {
hidehiko 2015/12/29 13:27:12 This method looks not actually close the channels?
Luis Héctor Chávez 2015/12/29 17:17:36 It does, but let me add a comment to make it more
hidehiko 2016/01/05 08:17:13 Oh, I was confused by the name. So, let's rename t
Luis Héctor Chávez 2016/01/05 18:59:21 When there is an error, Mojo closes the channel fi
184 OnAppChannelClosed();
185 OnInputChannelClosed();
186 OnNotificationsChannelClosed();
187 OnPowerChannelClosed();
188 OnProcessChannelClosed();
189 OnSettingsChannelClosed();
190 }
191
116 } // namespace arc 192 } // namespace arc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698