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..36d4806fe58b1e6d91b141022a0ac18460879b1b 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 |
@@ -11,6 +11,7 @@ |
#include <utility> |
#include <vector> |
+#include "base/callback.h" |
#include "base/logging.h" |
#include "base/process/process.h" |
#include "base/threading/thread_task_runner_handle.h" |
@@ -23,7 +24,8 @@ namespace task_management { |
namespace { |
-const int kUpdateProcessListDelaySeconds = 1; |
+const int kUpdateAppProcessListDelaySeconds = 1; |
+const int kUpdateSystemProcessListDelaySeconds = 3; |
} // namespace |
@@ -44,10 +46,9 @@ Task* ArcProcessTaskProvider::GetTaskOfUrlRequest(int origin_pid, |
return nullptr; |
} |
-void ArcProcessTaskProvider::OnUpdateProcessList( |
+void ArcProcessTaskProvider::UpdateProcessList( |
+ ArcTaskMap* pid_to_task, |
const std::vector<ArcProcess>& processes) { |
- TRACE_EVENT0("browser", "ArcProcessTaskProvider::OnUpdateProcessList"); |
- |
if (!is_updating_) |
return; |
@@ -56,13 +57,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 +76,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 +84,83 @@ 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) { |
+ UpdateProcessList(&nspid_to_sys_task_, processes); |
+ 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."; |
+ ScheduleNextAppRequest(); |
+ return; |
+ } |
+} |
+ |
+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."; |
- // 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>()); |
+ ScheduleNextSystemRequest(); |
+ return; |
} |
+ arc_process_service->RequestSystemProcessList(callback); |
} |
void ArcProcessTaskProvider::StartUpdating() { |
is_updating_ = true; |
- RequestProcessList(); |
+ RequestAppProcessList(); |
+ RequestSystemProcessList(); |
} |
void ArcProcessTaskProvider::StopUpdating() { |
is_updating_ = false; |
nspid_to_task_.clear(); |
+ nspid_to_sys_task_.clear(); |
} |
-void ArcProcessTaskProvider::ScheduleNextRequest() { |
+void ArcProcessTaskProvider::ScheduleNextRequest(const base::Closure& task, |
+ const int delaySeconds) { |
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 RequestAppProcessList message. |
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&ArcProcessTaskProvider::RequestProcessList, |
+ FROM_HERE, task, base::TimeDelta::FromSeconds(delaySeconds)); |
+} |
+ |
+void ArcProcessTaskProvider::ScheduleNextAppRequest() { |
+ ScheduleNextRequest(base::Bind(&ArcProcessTaskProvider::RequestAppProcessList, |
+ weak_ptr_factory_.GetWeakPtr()), |
cylee1
2016/08/01 10:14:23
I still think you don't need weak_ptr here since S
Hsu-Cheng
2016/08/02 03:58:55
Done.
|
+ kUpdateAppProcessListDelaySeconds); |
+} |
+ |
+void ArcProcessTaskProvider::ScheduleNextSystemRequest() { |
+ ScheduleNextRequest( |
+ base::Bind(&ArcProcessTaskProvider::RequestSystemProcessList, |
weak_ptr_factory_.GetWeakPtr()), |
- base::TimeDelta::FromSeconds(kUpdateProcessListDelaySeconds)); |
+ kUpdateSystemProcessListDelaySeconds); |
} |
} // namespace task_management |