910e62b5创建于 1月15日历史提交
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tools/memory/simulator/memory_simulator.h"

#include <cstdint>

#include "base/check.h"
#include "base/debug/alias.h"
#include "base/logging.h"
#include "base/memory/page_size.h"
#include "base/time/time.h"
#include "tools/memory/simulator/contiguous_memory_holder.h"

namespace memory_simulator {

MemorySimulator::MemorySimulator() = default;
MemorySimulator::~MemorySimulator() = default;

void MemorySimulator::Start(int64_t page_alloc_per_sec,
                            int64_t page_read_per_sec,
                            int64_t page_write_per_sec,
                            int64_t max_pages_allocated,
                            base::TimeTicks read_deadline,
                            base::TimeTicks write_deadline) {
  memory_holder_ =
      std::make_unique<ContiguousMemoryHolder>(max_pages_allocated);
  max_pages_allocated_ = max_pages_allocated;

  if (page_alloc_per_sec != 0) {
    alloc_timer_.Start(FROM_HERE, base::Hertz(page_alloc_per_sec), this,
                       &MemorySimulator::Allocate);
  }

  if (page_read_per_sec != 0) {
    read_timer_.Start(FROM_HERE, base::Hertz(page_read_per_sec), this,
                      &MemorySimulator::Read);
    read_deadline_ = read_deadline;
  }

  if (page_write_per_sec != 0) {
    write_timer_.Start(FROM_HERE, base::Hertz(page_write_per_sec), this,
                       &MemorySimulator::Write);
    write_deadline_ = write_deadline;
  }
}

void MemorySimulator::StopAndFree() {
  memory_holder_.reset();
  alloc_timer_.Stop();
  read_timer_.Stop();
  write_timer_.Stop();
  pages_allocated_ = 0;
}

int64_t MemorySimulator::GetPagesAllocated() const {
  return pages_allocated_;
}

int64_t MemorySimulator::GetPagesRead() const {
  return pages_read_;
}

int64_t MemorySimulator::GetPagesWritten() const {
  return pages_written_;
}

void MemorySimulator::Allocate() {
  CHECK_LE(pages_allocated_, max_pages_allocated_);
  if (pages_allocated_ == max_pages_allocated_) {
    alloc_timer_.Stop();
    return;
  }

  memory_holder_->Allocate();
  ++pages_allocated_;
}

void MemorySimulator::Read() {
  if (base::TimeTicks::Now() >= read_deadline_) {
    read_timer_.Stop();
    return;
  }

  if (pages_allocated_ == 0) {
    return;
  }

  memory_holder_->Read();
  ++pages_read_;
}

void MemorySimulator::Write() {
  if (base::TimeTicks::Now() >= write_deadline_) {
    write_timer_.Stop();
    return;
  }

  if (pages_allocated_ == 0) {
    return;
  }

  memory_holder_->Write();
  ++pages_written_;
}

}  // namespace memory_simulator