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

#ifndef COMPONENTS_TRACING_COMMON_GRAPHICS_MEMORY_DUMP_PROVIDER_ANDROID_H_
#define COMPONENTS_TRACING_COMMON_GRAPHICS_MEMORY_DUMP_PROVIDER_ANDROID_H_

#include <stddef.h>

#include <string>

#include "base/containers/hash_tables.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/singleton.h"
#include "base/trace_event/memory_dump_provider.h"
#include "components/tracing/tracing_export.h"

namespace tracing {

// Dump provider which collects memory stats about graphics memory on Android.
// This requires the presence of the memtrack_helper daemon, which must be
// executed separetely via a (root) adb shell command. The dump provider will
// fail (and hence disabled by the MemoryDumpManager) in absence of the helper.
// See the design-doc https://goo.gl/4Y30p9 for more details.
class TRACING_EXPORT GraphicsMemoryDumpProvider
    : public base::trace_event::MemoryDumpProvider {
 public:
  static GraphicsMemoryDumpProvider* GetInstance();

  // MemoryDumpProvider implementation.
  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
                    base::trace_event::ProcessMemoryDump* pmd) override;

 private:
  FRIEND_TEST_ALL_PREFIXES(GraphicsMemoryDumpProviderTest, ParseResponse);
  friend struct base::DefaultSingletonTraits<GraphicsMemoryDumpProvider>;

  void ParseResponseAndAddToDump(const char* buf,
                                 size_t length,
                                 base::trace_event::ProcessMemoryDump* pmd);

  GraphicsMemoryDumpProvider();
  ~GraphicsMemoryDumpProvider() override;

  static const char kDumpBaseName[];  // Used by the unittest.

  // Stores key names coming from the memtrack helper in long-lived storage.
  // This is to allow using cheap char* strings in tracing without copies.
  base::hash_set<std::string> key_names_;

  DISALLOW_COPY_AND_ASSIGN(GraphicsMemoryDumpProvider);
};

}  // namespace tracing

#endif  // COMPONENTS_TRACING_COMMON_GRAPHICS_MEMORY_DUMP_PROVIDER_ANDROID_H_
