blob: 71a882d3518a6f9ecc852f47c265504f13cef288 [file] [log] [blame] [edit]
// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/async-loop/cpp/loop.h>
#include <lib/component/incoming/cpp/protocol.h>
#include <lib/component/outgoing/cpp/outgoing_directory.h>
#include <lib/syslog/cpp/macros.h>
#include <filesystem>
#include "src/developer/memory/pressure_signaler/debugger.h"
#include "src/developer/memory/pressure_signaler/pressure_notifier.h"
namespace {
const char kNotfiyCrashReporterPath[] = "/config/data/send_critical_pressure_crash_reports";
bool SendCriticalMemoryPressureCrashReports() {
std::error_code _ignore;
return std::filesystem::exists(kNotfiyCrashReporterPath, _ignore);
}
} // namespace
int main(int argc, const char** argv) {
FX_LOGS(DEBUG) << argv[0] << ": starting";
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
async_dispatcher_t* dispatcher = loop.dispatcher();
component::OutgoingDirectory outgoing = component::OutgoingDirectory(dispatcher);
zx::result result = outgoing.ServeFromStartupInfo();
if (result.is_error()) {
FX_LOGS(ERROR) << "Failed to serve the outgoing directory from startup info: "
<< result.status_string();
return -1;
}
auto client_end = component::Connect<fuchsia_feedback::CrashReporter>();
if (!client_end.is_ok()) {
FX_LOGS(ERROR) << "Failed to connect to fuchsia.feedback::CrashReporter: "
<< client_end.status_string();
return -1;
}
auto crash_reporter =
fidl::Client<fuchsia_feedback::CrashReporter>(std::move(client_end.value()), dispatcher);
auto notifier = std::make_unique<pressure_signaler::PressureNotifier>(
/* watch_for_changes = */ true, SendCriticalMemoryPressureCrashReports(),
std::move(crash_reporter), dispatcher);
auto debugger = std::make_unique<pressure_signaler::MemoryDebugger>(notifier.get());
result = outgoing.AddProtocol<fuchsia_memorypressure::Provider>(std::move(notifier));
if (result.is_error()) {
FX_LOGS(ERROR) << "Failed to serve the fuchsia.memorypressure::Provider protocol: "
<< result.status_string();
return -1;
}
result = outgoing.AddProtocol<fuchsia_memory_debug::MemoryPressure>(std::move(debugger));
if (result.is_error()) {
FX_LOGS(ERROR) << "Failed to serve the fuchsia.memory.debug::MemoryPressure protocol: "
<< result.status_string();
return -1;
}
loop.Run();
FX_LOGS(DEBUG) << argv[0] << ": exiting";
return 0;
}