// 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(DEBUG) || !defined(DART_USE_TCMALLOC)

#include "vm/malloc_hooks.h"

#include "vm/json_stream.h"

#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_ANDROID)
#include <malloc.h>
#elif defined(DART_HOST_OS_MACOS)
#include <malloc/malloc.h>
#endif

#if !defined(DART_HOST_OS_WINDOWS) && !defined(DART_HOST_OS_MACOS)
extern "C" {
__attribute__((weak)) uintptr_t __sanitizer_get_current_allocated_bytes();
__attribute__((weak)) uintptr_t __sanitizer_get_heap_size();
__attribute__((weak)) int __sanitizer_install_malloc_and_free_hooks(
    void (*malloc_hook)(const void*, uintptr_t),
    void (*free_hook)(const void*));
}
#endif

namespace dart {

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

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

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;
}

bool MallocHooks::GetStats(intptr_t* used,
                           intptr_t* capacity,
                           const char** implementation) {
#if !defined(PRODUCT)
#if !defined(DART_HOST_OS_WINDOWS) && !defined(DART_HOST_OS_MACOS)
  if (__sanitizer_get_current_allocated_bytes != nullptr &&
      __sanitizer_get_heap_size != nullptr) {
    *used = __sanitizer_get_current_allocated_bytes();
    *capacity = __sanitizer_get_heap_size();
    *implementation = "scudo";
    return true;
  }
#endif
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_ANDROID)
  struct mallinfo info = mallinfo();
  *used = info.uordblks;
  *capacity = *used + info.fordblks;
  *implementation = "unknown";
  return true;
#elif defined(DART_HOST_OS_MACOS)
  struct mstats stats = mstats();
  *used = stats.bytes_used;
  *capacity = stats.bytes_total;
  *implementation = "macos";
  return true;
#else
  return false;
#endif
#else
  return false;
#endif
}

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

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

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

}  // namespace dart

#endif  // !defined(DART_USE_TCMALLOC) && ...
