blob: 23a9b2d9dd93099f9f3e1c2d0cb10e92468347c2 [file] [log] [blame]
// 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 "chrome/browser/ash/arc/process/arc_process.h"
#include <utility>
#include "base/no_destructor.h"
#include "base/strings/string_util.h"
#include "components/arc/mojom/process.mojom.h"
namespace arc {
using mojom::ProcessState;
namespace {
constexpr char kCloudDpcrocessName[] =
"com.google.android.apps.work.clouddpc.arc";
bool IsImportantState(ProcessState state) {
switch (state) {
case ProcessState::IMPORTANT_FOREGROUND:
case ProcessState::BOUND_FOREGROUND_SERVICE:
case ProcessState::FOREGROUND_SERVICE:
case ProcessState::TOP:
case ProcessState::PERSISTENT_UI:
case ProcessState::PERSISTENT:
return true;
default:
return false;
}
}
bool IsPersistentState(ProcessState state) {
switch (state) {
case ProcessState::PERSISTENT_UI:
case ProcessState::PERSISTENT:
return true;
default:
return false;
}
}
bool IsProtectedBackgroundState(ProcessState state) {
switch (state) {
case ProcessState::TOP:
case ProcessState::FOREGROUND_SERVICE:
case ProcessState::BOUND_FOREGROUND_SERVICE:
case ProcessState::IMPORTANT_FOREGROUND:
case ProcessState::IMPORTANT_BACKGROUND:
return true;
default:
return false;
}
}
bool IsBackgroundState(ProcessState state) {
switch (state) {
case ProcessState::TRANSIENT_BACKGROUND:
case ProcessState::BACKUP:
case ProcessState::SERVICE:
case ProcessState::RECEIVER:
case ProcessState::TOP_SLEEPING:
case ProcessState::HEAVY_WEIGHT:
case ProcessState::HOME:
case ProcessState::LAST_ACTIVITY:
case ProcessState::CACHED_ACTIVITY:
return true;
default:
return false;
}
}
bool IsCachedState(ProcessState state) {
switch (state) {
case ProcessState::CACHED_ACTIVITY_CLIENT:
case ProcessState::CACHED_RECENT:
case ProcessState::CACHED_EMPTY:
case ProcessState::NONEXISTENT:
return true;
default:
return false;
}
}
} // namespace
ArcProcess::ArcProcess(base::ProcessId nspid,
base::ProcessId pid,
const std::string& process_name,
mojom::ProcessState process_state,
bool is_focused,
int64_t last_activity_time)
: nspid_(nspid),
pid_(pid),
process_name_(process_name),
process_state_(process_state),
is_focused_(is_focused),
last_activity_time_(last_activity_time) {}
ArcProcess::~ArcProcess() = default;
// Sort by (process_state, last_activity_time) pair.
// Smaller process_state value means higher priority as defined in Android.
// Larger last_activity_time means more recently used.
bool ArcProcess::operator<(const ArcProcess& rhs) const {
return std::make_pair(process_state(), -last_activity_time()) <
std::make_pair(rhs.process_state(), -rhs.last_activity_time());
}
ArcProcess::ArcProcess(ArcProcess&& other) = default;
ArcProcess& ArcProcess::operator=(ArcProcess&& other) = default;
bool ArcProcess::IsImportant() const {
return IsImportantState(process_state()) || IsArcProtected();
}
bool ArcProcess::IsPersistent() const {
// Protect PERSISTENT, PERSISTENT_UI, our HOME and custom set of ARC processes
// since they should have lower priority to be killed.
return IsPersistentState(process_state()) || IsArcProtected();
}
bool ArcProcess::IsCached() const {
return IsCachedState(process_state());
}
bool ArcProcess::IsBackgroundProtected() const {
return IsProtectedBackgroundState(process_state());
}
bool ArcProcess::IsArcProtected() const {
return process_name() == kCloudDpcrocessName;
}
std::ostream& operator<<(std::ostream& out, const ArcProcess& arc_process) {
out << "process_name: " << arc_process.process_name()
<< ", pid: " << arc_process.pid()
<< ", process_state: " << arc_process.process_state()
<< ", is_focused: " << arc_process.is_focused()
<< ", last_activity_time: " << arc_process.last_activity_time()
<< ", packages: " << base::JoinString(arc_process.packages(), ",");
return out;
}
} // namespace arc