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

Side by Side Diff: chrome/browser/task_management/providers/arc/arc_process_task_provider.cc

Issue 1523643002: arc-bridge: Move most methods to Mojo interfaces (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: Rebased to ToT Created 5 years 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 "chrome/browser/task_management/providers/arc/arc_process_task_provider .h" 5 #include "chrome/browser/task_management/providers/arc/arc_process_task_provider .h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 queue.push(child_pid); 74 queue.push(child_pid);
75 } 75 }
76 } 76 }
77 return nspid_to_pid; 77 return nspid_to_pid;
78 } 78 }
79 79
80 } // namespace 80 } // namespace
81 81
82 namespace task_management { 82 namespace task_management {
83 83
84 ArcProcessTaskProvider::ArcProcessTaskProvider() 84 ArcProcessTaskProvider::ArcProcessTaskProvider() : weak_ptr_factory_(this) {}
85 : weak_ptr_factory_(this) {
86 }
87 85
88 ArcProcessTaskProvider::~ArcProcessTaskProvider() { 86 ArcProcessTaskProvider::~ArcProcessTaskProvider() {}
89 }
90 87
91 Task* ArcProcessTaskProvider::GetTaskOfUrlRequest(int origin_pid, 88 Task* ArcProcessTaskProvider::GetTaskOfUrlRequest(int origin_pid,
92 int child_id, 89 int child_id,
93 int route_id) { 90 int route_id) {
94 // ARC tasks are not associated with any URL request. 91 // ARC tasks are not associated with any URL request.
95 return nullptr; 92 return nullptr;
96 } 93 }
97 94
98 void ArcProcessTaskProvider::OnUpdateProcessList( 95 void ArcProcessTaskProvider::OnUpdateProcessList(
99 const std::vector<arc::RunningAppProcessInfo>& processes) { 96 mojo::Array<arc::RunningAppProcessInfoPtr> processes) {
100 TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateProcessList"); 97 TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateProcessList");
101 98
102 // NB: |processes| can be already stale here because it is sent via IPC, and 99 // NB: |processes| can be already stale here because it is sent via IPC, and
103 // we can never avoid that. See also the comment at the declaration of 100 // we can never avoid that. See also the comment at the declaration of
104 // ArcProcessTaskProvider. 101 // ArcProcessTaskProvider.
105 102
106 std::vector<arc::RunningAppProcessInfo> added_processes; 103 std::vector<arc::RunningAppProcessInfo> added_processes;
107 std::set<base::ProcessId> removed_nspids; 104 std::set<base::ProcessId> removed_nspids;
108 for (const auto& entry : nspid_to_task_) 105 for (const auto& entry : nspid_to_task_)
109 removed_nspids.insert(entry.first); 106 removed_nspids.insert(entry.first);
110 for (const arc::RunningAppProcessInfo& process : processes) { 107 for (size_t i = 0; i < processes.size(); ++i) {
111 if (nspid_to_task_.count(process.pid)) 108 const arc::RunningAppProcessInfoPtr& process = processes[i];
112 removed_nspids.erase(process.pid); 109 if (nspid_to_task_.count(process->pid))
110 removed_nspids.erase(process->pid);
113 else 111 else
114 added_processes.push_back(process); 112 added_processes.push_back(*process);
115 } 113 }
116 114
117 // Remove stale tasks. 115 // Remove stale tasks.
118 RemoveTasks(removed_nspids); 116 RemoveTasks(removed_nspids);
119 117
120 // Add new tasks. 118 // Add new tasks.
121 // Note: ComputeNspidToPidMap() is an expensive operation, so try to reduce 119 // Note: ComputeNspidToPidMap() is an expensive operation, so try to reduce
122 // the number of times it is called. 120 // the number of times it is called.
123 if (!added_processes.empty()) { 121 if (!added_processes.empty()) {
124 base::PostTaskAndReplyWithResult( 122 base::PostTaskAndReplyWithResult(
125 base::WorkerPool::GetTaskRunner(false /* task_is_slow */).get(), 123 base::WorkerPool::GetTaskRunner(false /* task_is_slow */).get(),
126 FROM_HERE, 124 FROM_HERE,
127 base::Bind(&ComputeNspidToPidMap), 125 base::Bind(&ComputeNspidToPidMap),
128 base::Bind(&ArcProcessTaskProvider::AddTasks, 126 base::Bind(&ArcProcessTaskProvider::AddTasks,
129 weak_ptr_factory_.GetWeakPtr(), 127 weak_ptr_factory_.GetWeakPtr(),
130 added_processes)); 128 added_processes));
131 } 129 }
132 } 130 }
133 131
134 void ArcProcessTaskProvider::RequestProcessList() { 132 void ArcProcessTaskProvider::RequestProcessList() {
135 arc::ArcBridgeService::Get()->RequestProcessList(); 133 arc::ProcessInstance* arc_process_instance =
134 arc::ArcBridgeService::Get()->process_instance();
135 if (!arc_process_instance) {
136 VLOG(2) << "ARC process instance is not ready.";
137 return;
138 }
139 arc_process_instance->RequestProcessList(
140 base::Bind(&ArcProcessTaskProvider::OnUpdateProcessList,
141 weak_ptr_factory_.GetWeakPtr()));
136 } 142 }
137 143
138 void ArcProcessTaskProvider::RemoveTasks( 144 void ArcProcessTaskProvider::RemoveTasks(
139 const std::set<base::ProcessId>& removed_nspids) { 145 const std::set<base::ProcessId>& removed_nspids) {
140 for (base::ProcessId nspid : removed_nspids) { 146 for (base::ProcessId nspid : removed_nspids) {
141 NotifyObserverTaskRemoved(nspid_to_task_[nspid].get()); 147 NotifyObserverTaskRemoved(nspid_to_task_[nspid].get());
142 nspid_to_task_.erase(nspid); 148 nspid_to_task_.erase(nspid);
143 } 149 }
144 } 150 }
145 151
146 void ArcProcessTaskProvider::AddTasks( 152 void ArcProcessTaskProvider::AddTasks(
147 const std::vector<arc::RunningAppProcessInfo>& added_processes, 153 const std::vector<arc::RunningAppProcessInfo>& added_processes,
148 const std::map<base::ProcessId, base::ProcessId>& nspid_to_pid) { 154 const std::map<base::ProcessId, base::ProcessId>& nspid_to_pid) {
149 for (const arc::RunningAppProcessInfo& process : added_processes) { 155 for (const arc::RunningAppProcessInfo& process : added_processes) {
150 auto iter = nspid_to_pid.find(process.pid); 156 auto iter = nspid_to_pid.find(process.pid);
151 if (iter == nspid_to_pid.end()) { 157 if (iter == nspid_to_pid.end()) {
152 // The process may have exited just after the snapshot was generated. 158 // The process may have exited just after the snapshot was generated.
153 continue; 159 continue;
154 } 160 }
155 base::ProcessId pid = iter->second; 161 base::ProcessId pid = iter->second;
156 scoped_ptr<ArcProcessTask>& task = nspid_to_task_[process.pid]; 162 scoped_ptr<ArcProcessTask>& task = nspid_to_task_[process.pid];
157 task.reset(new ArcProcessTask(pid, process.pid, process.process_name)); 163 task.reset(new ArcProcessTask(pid, process.pid, process.process_name));
158 NotifyObserverTaskAdded(task.get()); 164 NotifyObserverTaskAdded(task.get());
159 } 165 }
160 } 166 }
161 167
162 void ArcProcessTaskProvider::StartUpdating() { 168 void ArcProcessTaskProvider::StartUpdating() {
163 arc::ArcBridgeService::Get()->AddProcessObserver(this);
164 RequestProcessList(); 169 RequestProcessList();
165 // TODO(nya): Remove this timer once ARC starts to send us UpdateProcessList 170 // TODO(nya): Remove this timer once ARC starts to send us UpdateProcessList
166 // message when the process list changed. As of today, ARC does not send 171 // message when the process list changed. As of today, ARC does not send
167 // the process list unless we request it by RequestProcessList message. 172 // the process list unless we request it by RequestProcessList message.
168 timer_.Start( 173 timer_.Start(
169 FROM_HERE, 174 FROM_HERE,
170 base::TimeDelta::FromSeconds(1), 175 base::TimeDelta::FromSeconds(1),
171 this, 176 this,
172 &ArcProcessTaskProvider::RequestProcessList); 177 &ArcProcessTaskProvider::RequestProcessList);
173 } 178 }
174 179
175 void ArcProcessTaskProvider::StopUpdating() { 180 void ArcProcessTaskProvider::StopUpdating() {
176 arc::ArcBridgeService::Get()->RemoveProcessObserver(this);
177 timer_.Stop(); 181 timer_.Stop();
178 nspid_to_task_.clear(); 182 nspid_to_task_.clear();
179 } 183 }
180 184
181 } // namespace task_management 185 } // namespace task_management
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698