mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-28 07:49:01 -04:00

Summary: This is the first part of our effort to make llgs single threaded. Currently, llgs consists of about three threads and the synchronisation between them is a major source of latency when debugging linux and android applications. In order to be able to go single threaded, we must have the ability to listen for events from multiple sources (primarily, client commands coming over the network and debug events from the inferior) and perform necessary actions. For this reason I introduce the concept of a MainLoop. A main loop has the ability to register callback's which will be invoked upon receipt of certain events. MainLoopPosix has the ability to listen for file descriptors and signals. For the moment, I have merely made the GDBRemoteCommunicationServerLLGS class use MainLoop instead of waiting on the network socket directly, but the other threads still remain. In the followup patches I indend to migrate NativeProcessLinux to this class and remove the remaining threads. Reviewers: ovyalov, clayborg, amccarth, zturner, emaste Subscribers: tberghammer, lldb-commits Differential Revision: http://reviews.llvm.org/D11066 llvm-svn: 242018
86 lines
2.6 KiB
C++
86 lines
2.6 KiB
C++
//===-- GDBRemoteCommunicationServer.h --------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_GDBRemoteCommunicationServer_h_
|
|
#define liblldb_GDBRemoteCommunicationServer_h_
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
#include <functional>
|
|
#include <map>
|
|
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "lldb/lldb-private-forward.h"
|
|
#include "GDBRemoteCommunication.h"
|
|
|
|
class StringExtractorGDBRemote;
|
|
|
|
namespace lldb_private {
|
|
namespace process_gdb_remote {
|
|
|
|
class ProcessGDBRemote;
|
|
|
|
class GDBRemoteCommunicationServer : public GDBRemoteCommunication
|
|
{
|
|
public:
|
|
using PortMap = std::map<uint16_t, lldb::pid_t>;
|
|
using PacketHandler = std::function<PacketResult(StringExtractorGDBRemote &packet,
|
|
Error &error,
|
|
bool &interrupt,
|
|
bool &quit)>;
|
|
|
|
GDBRemoteCommunicationServer(const char *comm_name,
|
|
const char *listener_name);
|
|
|
|
virtual
|
|
~GDBRemoteCommunicationServer();
|
|
|
|
void RegisterPacketHandler(StringExtractorGDBRemote::ServerPacketType packet_type,
|
|
PacketHandler handler);
|
|
|
|
PacketResult
|
|
GetPacketAndSendResponse (uint32_t timeout_usec,
|
|
Error &error,
|
|
bool &interrupt,
|
|
bool &quit);
|
|
|
|
// After connecting, do a little handshake with the client to make sure
|
|
// we are at least communicating
|
|
bool
|
|
HandshakeWithClient ();
|
|
|
|
protected:
|
|
std::map<StringExtractorGDBRemote::ServerPacketType, PacketHandler> m_packet_handlers;
|
|
bool m_exit_now; // use in asynchronous handling to indicate process should exit.
|
|
|
|
PacketResult
|
|
SendUnimplementedResponse (const char *packet);
|
|
|
|
PacketResult
|
|
SendErrorResponse (uint8_t error);
|
|
|
|
PacketResult
|
|
SendIllFormedResponse (const StringExtractorGDBRemote &packet, const char *error_message);
|
|
|
|
PacketResult
|
|
SendOKResponse ();
|
|
|
|
private:
|
|
//------------------------------------------------------------------
|
|
// For GDBRemoteCommunicationServer only
|
|
//------------------------------------------------------------------
|
|
DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServer);
|
|
};
|
|
|
|
} // namespace process_gdb_remote
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_GDBRemoteCommunicationServer_h_
|