// Copyright 2015 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 "base/trace_event/process_memory_totals.h"

#include "base/format_macros.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/trace_event_argument.h"

namespace base {
namespace trace_event {

ProcessMemoryTotals::ProcessMemoryTotals()
    : resident_set_bytes_(0),
      peak_resident_set_bytes_(0),
      is_peak_rss_resetable_(false) {
}

ProcessMemoryTotals::~ProcessMemoryTotals() {}

void ProcessMemoryTotals::AsValueInto(TracedValue* value) const {
  value->SetString("resident_set_bytes",
                   StringPrintf("%" PRIx64, resident_set_bytes_));
  if (peak_resident_set_bytes_ > 0) {
    value->SetString("peak_resident_set_bytes",
                     StringPrintf("%" PRIx64, peak_resident_set_bytes_));
    value->SetBoolean("is_peak_rss_resetable", is_peak_rss_resetable_);
  }

  for (const auto it : extra_fields_) {
    value->SetString(it.first, StringPrintf("%" PRIx64, it.second));
  }
}

void ProcessMemoryTotals::Clear() {
  resident_set_bytes_ = 0;
}

void ProcessMemoryTotals::SetExtraFieldInBytes(const char* name,
                                               uint64_t value) {
  DCHECK_EQ(0u, extra_fields_.count(name));
  extra_fields_[name] = value;
}

}  // namespace trace_event
}  // namespace base