blob: 8281c41204b62ecc830c5d36fb1c362f31dea45d [file] [log] [blame]
// Copyright 2017 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 SERVICES_RESOURCE_COORDINATOR_MEMORY_COORDINATOR_COORDINATOR_IMPL_H_
#define SERVICES_RESOURCE_COORDINATOR_MEMORY_COORDINATOR_COORDINATOR_IMPL_H_
#include <list>
#include <set>
#include <unordered_map>
#include "base/memory/ref_counted.h"
#include "base/threading/thread_checker.h"
#include "base/trace_event/memory_dump_request_args.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/resource_coordinator/public/cpp/memory/coordinator.h"
#include "services/resource_coordinator/public/interfaces/memory/memory_instrumentation.mojom.h"
namespace memory_instrumentation {
class CoordinatorImpl : public Coordinator, public mojom::Coordinator {
public:
// The getter of the unique instance.
static CoordinatorImpl* GetInstance();
explicit CoordinatorImpl(bool initialize_memory_dump_manager);
// Coordinator
void BindCoordinatorRequest(mojom::CoordinatorRequest) override;
bool initialize_memory_dump_manager() const {
return initialize_memory_dump_manager_;
}
private:
friend std::default_delete<CoordinatorImpl>; // For testing
friend class CoordinatorImplTest; // For testing
struct QueuedMemoryDumpRequest {
QueuedMemoryDumpRequest(const base::trace_event::MemoryDumpRequestArgs args,
const RequestGlobalMemoryDumpCallback callback);
~QueuedMemoryDumpRequest();
const base::trace_event::MemoryDumpRequestArgs args;
const RequestGlobalMemoryDumpCallback callback;
};
~CoordinatorImpl() override;
// mojom::Coordinator
void RegisterProcessLocalDumpManager(
mojom::ProcessLocalDumpManagerPtr process_manager) override;
// Broadcasts a dump request to all the process-local managers registered and
// notifies when all of them have completed, or the global dump attempt
// failed. This is in the mojom::Coordinator interface.
void RequestGlobalMemoryDump(
const base::trace_event::MemoryDumpRequestArgs& args,
const RequestGlobalMemoryDumpCallback& callback) override;
// Called when a process-local manager gets disconnected.
void UnregisterProcessLocalDumpManager(
mojom::ProcessLocalDumpManager* process_manager);
// Callback of RequestProcessMemoryDump.
void OnProcessMemoryDumpResponse(
mojom::ProcessLocalDumpManager* process_manager,
uint64_t dump_guid,
bool success,
const base::Optional<base::trace_event::MemoryDumpCallbackResult>&
result);
void PerformNextQueuedGlobalMemoryDump();
void FinalizeGlobalMemoryDumpIfAllManagersReplied();
mojo::BindingSet<mojom::Coordinator> bindings_;
// Registered ProcessLocalDumpManagers.
std::unordered_map<mojom::ProcessLocalDumpManager*,
mojom::ProcessLocalDumpManagerPtr>
process_managers_;
// Pending process managers for RequestGlobalMemoryDump.
std::set<mojom::ProcessLocalDumpManager*> pending_process_managers_;
int failed_memory_dump_count_;
std::list<QueuedMemoryDumpRequest> queued_memory_dump_requests_;
const bool initialize_memory_dump_manager_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(CoordinatorImpl);
};
} // namespace memory_instrumentation
#endif // SERVICES_RESOURCE_COORDINATOR_MEMORY_COORDINATOR_COORDINATOR_IMPL_H_