// 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 void PrintToJSONObject(JSONObject* jsobj);
  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_
