blob: 374e17a01522affcf7794bcab8fd84575b53ba60 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/performance_manager/freezing/frozen_data.h"
#include "base/check_op.h"
namespace performance_manager {
FrozenData::FrozenData() = default;
bool FrozenData::IsFrozen() const {
return current_frame_count_ > 0 &&
frozen_frame_count_ == current_frame_count_;
}
// Returns the state as an equivalent LifecycleState.
performance_manager::mojom::LifecycleState FrozenData::AsLifecycleState()
const {
if (IsFrozen()) {
return performance_manager::mojom::LifecycleState::kFrozen;
}
return performance_manager::mojom::LifecycleState::kRunning;
}
bool FrozenData::ChangeFrameCounts(int32_t current_frame_delta,
int32_t frozen_frame_delta) {
// Each delta should be -1, 0 or 1.
DCHECK(current_frame_delta != 0 || frozen_frame_delta != 0);
DCHECK_GE(1, abs(current_frame_delta));
DCHECK_GE(1, abs(frozen_frame_delta));
// We should never have (-1, 1) or (1, -1).
DCHECK_NE(-current_frame_delta, frozen_frame_delta);
// If the deltas are negative, the counts need to be positive.
DCHECK(current_frame_delta >= 0 || current_frame_count_ > 0);
DCHECK(frozen_frame_delta >= 0 || frozen_frame_count_ > 0);
bool was_frozen = IsFrozen();
current_frame_count_ += current_frame_delta;
frozen_frame_count_ += frozen_frame_delta;
return IsFrozen() != was_frozen;
}
base::Value::Dict FrozenData::Describe() {
base::Value::Dict ret;
ret.Set("current_frame_count", static_cast<int>(current_frame_count_));
ret.Set("frozen_frame_count", static_cast<int>(frozen_frame_count_));
return ret;
}
} // namespace performance_manager