Index: chrome/browser/task_management/providers/arc/arc_process_task_provider.cc |
diff --git a/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc b/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc |
index e119ded47007ad5ff4b871e0cb04f383bb9eb215..bcce6040ca7545a809d009a141c70b356877e855 100644 |
--- a/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc |
+++ b/chrome/browser/task_management/providers/arc/arc_process_task_provider.cc |
@@ -23,7 +23,8 @@ namespace task_management { |
namespace { |
-const int kUpdateProcessListDelaySeconds = 1; |
+const int kUpdateAppProcessListDelaySeconds = 1; |
+const int kUpdateSystemProcessListDelaySeconds = 3; |
} // namespace |
@@ -44,10 +45,9 @@ Task* ArcProcessTaskProvider::GetTaskOfUrlRequest(int origin_pid, |
return nullptr; |
} |
-void ArcProcessTaskProvider::OnUpdateProcessList( |
+void ArcProcessTaskProvider::UpdateProcessList( |
+ std::map<base::ProcessId, std::unique_ptr<ArcProcessTask>>& pid_to_task, |
const std::vector<ArcProcess>& processes) { |
- TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateProcessList"); |
- |
if (!is_updating_) |
return; |
@@ -56,13 +56,13 @@ void ArcProcessTaskProvider::OnUpdateProcessList( |
// ArcProcessTaskProvider. |
set<ProcessId> nspid_to_remove; |
- for (const auto& entry : nspid_to_task_) |
+ for (const auto& entry : pid_to_task) |
nspid_to_remove.insert(entry.first); |
for (const auto& entry : processes) { |
if (nspid_to_remove.erase(entry.nspid()) == 0) { |
// New arc process. |
- std::unique_ptr<ArcProcessTask>& task = nspid_to_task_[entry.nspid()]; |
+ std::unique_ptr<ArcProcessTask>& task = pid_to_task[entry.nspid()]; |
// After calling NotifyObserverTaskAdded(), the raw pointer of |task| is |
// remebered somewhere else. One should not (implicitly) delete the |
// referenced object before calling NotifyObserverTaskRemoved() first |
@@ -75,7 +75,7 @@ void ArcProcessTaskProvider::OnUpdateProcessList( |
NotifyObserverTaskAdded(task.get()); |
} else { |
// Update process state of existing process. |
- std::unique_ptr<ArcProcessTask>& task = nspid_to_task_[entry.nspid()]; |
+ std::unique_ptr<ArcProcessTask>& task = pid_to_task[entry.nspid()]; |
DCHECK(task.get()); |
task->SetProcessState(entry.process_state()); |
} |
@@ -83,48 +83,88 @@ void ArcProcessTaskProvider::OnUpdateProcessList( |
for (const auto& entry : nspid_to_remove) { |
// Stale arc process. |
- NotifyObserverTaskRemoved(nspid_to_task_[entry].get()); |
- nspid_to_task_.erase(entry); |
+ NotifyObserverTaskRemoved(pid_to_task[entry].get()); |
+ pid_to_task.erase(entry); |
} |
- ScheduleNextRequest(); |
} |
-void ArcProcessTaskProvider::RequestProcessList() { |
+void ArcProcessTaskProvider::OnUpdateAppProcessList( |
+ const std::vector<ArcProcess>& processes) { |
+ TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateAppProcessList"); |
+ |
+ UpdateProcessList(nspid_to_task_, processes); |
+ ScheduleNextAppRequest(); |
+} |
+ |
+void ArcProcessTaskProvider::OnUpdateSystemProcessList( |
+ const std::vector<ArcProcess>& processes) { |
+ TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateSystemProcessList"); |
+ |
+ UpdateProcessList(pid_to_sys_task_, processes); |
cylee1
2016/06/30 03:45:52
it's called pid_to_sys_task_ but its key is actual
Hsu-Cheng
2016/06/30 09:56:24
Done.
|
+ ScheduleNextSystemRequest(); |
+} |
+ |
+void ArcProcessTaskProvider::RequestAppProcessList() { |
arc::ArcProcessService* arc_process_service = |
arc::ArcProcessService::Get(); |
- auto callback = base::Bind(&ArcProcessTaskProvider::OnUpdateProcessList, |
+ auto callback = base::Bind(&ArcProcessTaskProvider::OnUpdateAppProcessList, |
weak_ptr_factory_.GetWeakPtr()); |
if (!arc_process_service || |
- !arc_process_service->RequestProcessList(callback)) { |
+ !arc_process_service->RequestAppProcessList(callback)) { |
VLOG(2) << "ARC process instance is not ready."; |
- // Update with the empty ARC process list. |
- // Note that this can happen in the middle of the session if the user has |
- // just opted out from ARC. |
- callback.Run(std::vector<ArcProcess>()); |
} |
} |
+void ArcProcessTaskProvider::RequestSystemProcessList() { |
+ arc::ArcProcessService* arc_process_service = |
+ arc::ArcProcessService::Get(); |
+ auto callback = base::Bind(&ArcProcessTaskProvider::OnUpdateSystemProcessList, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ if (!arc_process_service) { |
+ VLOG(2) << "ARC process instance is not ready."; |
+ } |
+ arc_process_service->RequestSystemProcessList( |
+ base::Bind(&ArcProcessTaskProvider::OnUpdateSystemProcessList, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ ScheduleNextSystemRequest(); |
+} |
+ |
void ArcProcessTaskProvider::StartUpdating() { |
is_updating_ = true; |
- RequestProcessList(); |
+ RequestAppProcessList(); |
+ RequestSystemProcessList(); |
} |
void ArcProcessTaskProvider::StopUpdating() { |
is_updating_ = false; |
nspid_to_task_.clear(); |
+ pid_to_sys_task_.clear(); |
+} |
+ |
+void ArcProcessTaskProvider::ScheduleNextAppRequest() { |
+ if (!is_updating_) |
+ return; |
+ // TODO(nya): Remove this timer once ARC starts to send us UpdateProcessList |
+ // message when the process list changed. As of today, ARC does not send |
+ // the process list unless we request it by RequestAppProcessList message. |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&ArcProcessTaskProvider::RequestAppProcessList, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::TimeDelta::FromSeconds(kUpdateAppProcessListDelaySeconds)); |
} |
-void ArcProcessTaskProvider::ScheduleNextRequest() { |
+void ArcProcessTaskProvider::ScheduleNextSystemRequest() { |
if (!is_updating_) |
return; |
// TODO(nya): Remove this timer once ARC starts to send us UpdateProcessList |
// message when the process list changed. As of today, ARC does not send |
- // the process list unless we request it by RequestProcessList message. |
+ // the process list unless we request it by RequestSystemProcessList message. |
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
FROM_HERE, |
- base::Bind(&ArcProcessTaskProvider::RequestProcessList, |
+ base::Bind(&ArcProcessTaskProvider::RequestSystemProcessList, |
weak_ptr_factory_.GetWeakPtr()), |
- base::TimeDelta::FromSeconds(kUpdateProcessListDelaySeconds)); |
+ base::TimeDelta::FromSeconds(kUpdateSystemProcessListDelaySeconds)); |
} |
} // namespace task_management |