// 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.

#ifndef RUNTIME_VM_MALLOC_HOOKS_H_
#define RUNTIME_VM_MALLOC_HOOKS_H_

#include "vm/allocation.h"
#include "vm/globals.h"

namespace dart {

class JSONObject;
class Sample;

// The number of frames that are generated by the malloc hooks and collection
// of the stack trace. These frames are ignored when collecting the stack
// trace for a memory allocation. If this number is incorrect, some tests in
// malloc_hook_tests.cc might fail, particularily
// StackTraceMallocHookLengthTest. If this value is updated, please make sure
// that the MallocHooks test cases pass on all platforms.
extern const intptr_t kSkipCount;

class MallocHooks : public AllStatic {
 public:
  static void Init();
  static void Cleanup();
  static bool ProfilingEnabled();
  static bool stack_trace_collection_enabled();
  static void set_stack_trace_collection_enabled(bool enabled);
  static void ResetStats();
  static bool Active();
  static bool GetStats(intptr_t* used,
                       intptr_t* capacity,
                       const char** implementation);
  static Sample* GetSample(const void* ptr);

  static intptr_t allocation_count();
  static intptr_t heap_allocated_memory_in_bytes();
};

}  // namespace dart

#endif  // RUNTIME_VM_MALLOC_HOOKS_H_
