blob: 9735a58167b2baeea59d69607256d8b13575ec45 [file] [log] [blame]
// Copyright 2018 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 <zircon/processargs.h>
#include "src/developer/debug/debug_agent/debug_agent.h"
#include "src/developer/debug/debug_agent/remote_api_adapter.h"
#include "src/developer/debug/debug_agent/zircon_system_interface.h"
#include "src/developer/debug/shared/platform_message_loop.h"
int main(int argc, const char* argv[]) {
debug::PlatformMessageLoop message_loop;
std::string init_error_message;
if (!message_loop.Init(&init_error_message)) {
FX_LOGS(ERROR) << init_error_message;
return 1;
}
// The scope ensures the objects are destroyed before calling Cleanup on the MessageLoop.
{
debug_agent::DebugAgent debug_agent(std::make_unique<debug_agent::ZirconSystemInterface>());
// Must correspond to main_launcher.cc.
zx::socket socket(zx_take_startup_handle(PA_HND(PA_USER0, 0)));
FX_CHECK(socket.is_valid());
debug::BufferedZxSocket buffer(std::move(socket));
// Route data from the zx::socket -> BufferedZxSocket -> RemoteAPIAdapter -> DebugAgent.
debug_agent::RemoteAPIAdapter adapter(&debug_agent, &buffer.stream());
buffer.set_data_available_callback([&adapter]() { adapter.OnStreamReadable(); });
// Exit the message loop on error.
buffer.set_error_callback([&debug_agent, &message_loop]() {
DEBUG_LOG(Agent) << "Remote socket connection lost";
message_loop.QuitNow();
debug_agent.Disconnect();
});
// Connect the buffer into the agent.
debug_agent.Connect(&buffer.stream());
if (!buffer.Start()) {
FX_LOGS(ERROR) << "Fail to connect to the FIDL socket";
} else {
FX_LOGS(INFO) << "Remote client connected to debug_agent";
message_loop.Run();
}
}
message_loop.Cleanup();
// It's very useful to have a simple message that informs the debug_agent exited successfully.
FX_LOGS(INFO) << "See you, Space Cowboy...";
return 0;
}