// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "platform/globals.h"
#if defined(DART_USE_JEMALLOC) && !defined(PRODUCT)

#include "vm/malloc_hooks.h"

#include <jemalloc/jemalloc.h>

#include "vm/json_stream.h"

namespace dart {

void MallocHooks::Init() {
  // Do nothing.
}

void MallocHooks::Cleanup() {
  // Do nothing.
}

void MallocHooks::PrintToJSONObject(JSONObject* jsobj) {
  // Here, we ignore the value of FLAG_profiler_native_memory because we can
  // gather this information cheaply without hooking into every call to the
  // malloc library.
  jsobj->AddProperty("_heapAllocatedMemoryUsage",
                     heap_allocated_memory_in_bytes());
  jsobj->AddProperty("_heapAllocationCount", allocation_count());
}

intptr_t MallocHooks::heap_allocated_memory_in_bytes() {
  uint64_t epoch = 1;
  size_t epoch_sz = sizeof(epoch);
  int result = mallctl("epoch", &epoch, &epoch_sz, &epoch, epoch_sz);
  if (result != 0) {
    return 0;
  }

  intptr_t allocated;
  size_t allocated_sz = sizeof(allocated);
  result = mallctl("stats.allocated", &allocated, &allocated_sz, NULL, 0);
  if (result != 0) {
    return 0;
  }
  return allocated;
}

intptr_t MallocHooks::allocation_count() {
  return 0;
}

bool MallocHooks::ProfilingEnabled() {
  return false;
}

bool MallocHooks::stack_trace_collection_enabled() {
  return false;
}

void MallocHooks::set_stack_trace_collection_enabled(bool enabled) {
  // Do nothing.
}

void MallocHooks::ResetStats() {
  // Do nothing.
}

bool MallocHooks::Active() {
  return false;
}

Sample* MallocHooks::GetSample(const void* ptr) {
  return NULL;
}

}  // namespace dart

#endif  // defined(DART_USE_JEMALLOC) && ...
