[Lldb-commits] [lldb] r233185 - Allow multiple simultaneous connections to platform.

Tamas Berghammer tberghammer at google.com
Wed Mar 25 07:24:22 PDT 2015


Please update the usage description in lldb-platform to reflect this change.

Thanks,
Tamas

On Wed, Mar 25, 2015 at 12:51 PM, Robert Flack <flackr at gmail.com> wrote:

> Author: flackr
> Date: Wed Mar 25 07:51:31 2015
> New Revision: 233185
>
> URL: http://llvm.org/viewvc/llvm-project?rev=233185&view=rev
> Log:
> Allow multiple simultaneous connections to platform.
>
> Adds the --server argument to lldb-server platform which when specified
> will allow multiple simultaneous connections by forking off to handle each
> individual connection. This will allow us to run the remote tests in
> parallel.
>
> Test Plan:
> Run: lldb-server platform --listen *:1234 --server
> Connect from multiple lldb clients simultaneously.
> I will also test running the test suite remotely with multiple
> simultaneous jobs.
>
> Differential Revision: http://reviews.llvm.org/D8452
>
> Modified:
>     lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h
>     lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp
>     lldb/trunk/tools/lldb-server/lldb-platform.cpp
>
> Modified:
> lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h?rev=233185&r1=233184&r2=233185&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h
> (original)
> +++ lldb/trunk/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h Wed
> Mar 25 07:51:31 2015
> @@ -38,6 +38,8 @@ class ConnectionFileDescriptor : public
>
>      ConnectionFileDescriptor(int fd, bool owns_fd);
>
> +    ConnectionFileDescriptor(Socket* socket);
> +
>      virtual ~ConnectionFileDescriptor();
>
>      bool IsConnected() const override;
> @@ -104,6 +106,8 @@ class ConnectionFileDescriptor : public
>      std::string m_uri;
>
>    private:
> +    void InitializeSocket(Socket* socket);
> +
>      DISALLOW_COPY_AND_ASSIGN(ConnectionFileDescriptor);
>  };
>
>
> Modified: lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp?rev=233185&r1=233184&r2=233185&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp
> (original)
> +++ lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp Wed Mar
> 25 07:51:31 2015
> @@ -81,6 +81,17 @@ ConnectionFileDescriptor::ConnectionFile
>      OpenCommandPipe();
>  }
>
> +ConnectionFileDescriptor::ConnectionFileDescriptor(Socket* socket)
> +    : Connection()
> +    , m_pipe()
> +    , m_mutex(Mutex::eMutexTypeRecursive)
> +    , m_shutting_down(false)
> +    , m_waiting_for_accept(false)
> +    , m_child_processes_inherit(false)
> +{
> +    InitializeSocket(socket);
> +}
> +
>  ConnectionFileDescriptor::~ConnectionFileDescriptor()
>  {
>      Log
> *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION |
> LIBLLDB_LOG_OBJECT));
> @@ -758,15 +769,7 @@ ConnectionFileDescriptor::SocketListenAn
>      if (error.Fail())
>          return eConnectionStatusError;
>
> -    m_write_sp.reset(socket);
> -    m_read_sp = m_write_sp;
> -    if (error.Fail())
> -    {
> -        return eConnectionStatusError;
> -    }
> -    StreamString strm;
> -    strm.Printf("connect://%s:%u",socket->GetRemoteIPAddress().c_str(),
> socket->GetRemotePortNumber());
> -    m_uri.swap(strm.GetString());
> +    InitializeSocket(socket);
>      return eConnectionStatusSuccess;
>  }
>
> @@ -831,3 +834,13 @@ ConnectionFileDescriptor::SetChildProces
>  {
>      m_child_processes_inherit = child_processes_inherit;
>  }
> +
> +void
> +ConnectionFileDescriptor::InitializeSocket(Socket* socket)
> +{
> +    m_write_sp.reset(socket);
> +    m_read_sp = m_write_sp;
> +    StreamString strm;
> +    strm.Printf("connect://%s:%u",socket->GetRemoteIPAddress().c_str(),
> socket->GetRemotePortNumber());
> +    m_uri.swap(strm.GetString());
> +}
>
> Modified: lldb/trunk/tools/lldb-server/lldb-platform.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-server/lldb-platform.cpp?rev=233185&r1=233184&r2=233185&view=diff
>
> ==============================================================================
> --- lldb/trunk/tools/lldb-server/lldb-platform.cpp (original)
> +++ lldb/trunk/tools/lldb-server/lldb-platform.cpp Wed Mar 25 07:51:31 2015
> @@ -19,6 +19,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
> +#include <sys/wait.h>
>
>  // C++ Includes
>
> @@ -30,6 +31,7 @@
>  #include "lldb/Host/ConnectionFileDescriptor.h"
>  #include "lldb/Host/HostGetOpt.h"
>  #include "lldb/Host/OptionParser.h"
> +#include "lldb/Host/Socket.h"
>  #include "lldb/Interpreter/CommandInterpreter.h"
>  #include "lldb/Interpreter/CommandReturnObject.h"
>  #include
> "Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.h"
> @@ -44,19 +46,19 @@ using namespace lldb_private;
>
>  static int g_debug = 0;
>  static int g_verbose = 0;
> -static int g_stay_alive = 0;
> +static int g_server = 0;
>
>  static struct option g_long_options[] =
>  {
>      { "debug",              no_argument,        &g_debug,           1   },
>      { "verbose",            no_argument,        &g_verbose,         1   },
> -    { "stay-alive",         no_argument,        &g_stay_alive,      1   },
>      { "listen",             required_argument,  NULL,               'L' },
>      { "port-offset",        required_argument,  NULL,               'p' },
>      { "gdbserver-port",     required_argument,  NULL,               'P' },
>      { "min-gdbserver-port", required_argument,  NULL,               'm' },
>      { "max-gdbserver-port", required_argument,  NULL,               'M' },
>      { "lldb-command",       required_argument,  NULL,               'c' },
> +    { "server",             no_argument,        &g_server,          1   },
>      { NULL,                 0,                  NULL,               0   }
>  };
>
> @@ -125,6 +127,7 @@ main_platform (int argc, char *argv[])
>      std::vector<std::string> lldb_commands;
>      bool show_usage = false;
>      int option_error = 0;
> +    int socket_error = -1;
>
>      std::string
> short_options(OptionParser::GetShortOptionString(g_long_options));
>
> @@ -246,6 +249,17 @@ main_platform (int argc, char *argv[])
>              puts(output);
>      }
>
> +    std::unique_ptr<Socket> listening_socket_up;
> +    Socket *socket = nullptr;
> +    printf ("Listening for a connection from %s...\n",
> listen_host_port.c_str());
> +    const bool children_inherit_listen_socket = false;
> +    error = Socket::TcpListen(listen_host_port.c_str(),
> children_inherit_listen_socket, socket, NULL);
> +    if (error.Fail())
> +    {
> +        printf("error: %s\n", error.AsCString());
> +        exit(socket_error);
> +    }
> +    listening_socket_up.reset(socket);
>
>      do {
>          GDBRemoteCommunicationServerPlatform platform;
> @@ -258,51 +272,64 @@ main_platform (int argc, char *argv[])
>              platform.SetPortMap(std::move(gdbserver_portmap));
>          }
>
> -        if (!listen_host_port.empty())
> +        const bool children_inherit_accept_socket = true;
> +        socket = nullptr;
> +        error =
> listening_socket_up->BlockingAccept(listen_host_port.c_str(),
> children_inherit_accept_socket, socket);
> +        if (error.Fail())
> +        {
> +            printf ("error: %s\n", error.AsCString());
> +            exit(socket_error);
> +        }
> +        printf ("Connection established.\n");
> +        if (g_server)
>          {
> -            std::unique_ptr<ConnectionFileDescriptor> conn_ap(new
> ConnectionFileDescriptor());
> -            if (conn_ap.get())
> +            // Collect child zombie processes.
> +            while (waitpid(-1, nullptr, WNOHANG) > 0);
> +            if (fork())
>              {
> -                std::string connect_url ("listen://");
> -                connect_url.append(listen_host_port.c_str());
> -
> -                printf ("Listening for a connection from %s...\n",
> listen_host_port.c_str());
> -                if (conn_ap->Connect(connect_url.c_str(), &error) ==
> eConnectionStatusSuccess)
> -                {
> -                    printf ("Connection established.\n");
> -                    platform.SetConnection (conn_ap.release());
> -                }
> -                else
> -                {
> -                    printf ("error: %s\n", error.AsCString());
> -                }
> +                // Parent will continue to listen for new connections.
> +                continue;
> +            }
> +            else
> +            {
> +                // Child process will handle the connection and exit.
> +                g_server = 0;
> +                // Listening socket is owned by parent process.
> +                listening_socket_up.release();
>              }
> +        }
> +        else
> +        {
> +            // If not running as a server, this process will not accept
> +            // connections while a connection is active.
> +            listening_socket_up.reset();
> +        }
> +        platform.SetConnection (new ConnectionFileDescriptor(socket));
>
> -            if (platform.IsConnected())
> +        if (platform.IsConnected())
> +        {
> +            // After we connected, we need to get an initial ack from...
> +            if (platform.HandshakeWithClient(&error))
>              {
> -                // After we connected, we need to get an initial ack
> from...
> -                if (platform.HandshakeWithClient(&error))
> +                bool interrupt = false;
> +                bool done = false;
> +                while (!interrupt && !done)
>                  {
> -                    bool interrupt = false;
> -                    bool done = false;
> -                    while (!interrupt && !done)
> -                    {
> -                        if (platform.GetPacketAndSendResponse
> (UINT32_MAX, error, interrupt, done) !=
> GDBRemoteCommunication::PacketResult::Success)
> -                            break;
> -                    }
> -
> -                    if (error.Fail())
> -                    {
> -                        fprintf(stderr, "error: %s\n", error.AsCString());
> -                    }
> +                    if (platform.GetPacketAndSendResponse (UINT32_MAX,
> error, interrupt, done) != GDBRemoteCommunication::PacketResult::Success)
> +                        break;
>                  }
> -                else
> +
> +                if (error.Fail())
>                  {
> -                    fprintf(stderr, "error: handshake with client
> failed\n");
> +                    fprintf(stderr, "error: %s\n", error.AsCString());
>                  }
>              }
> +            else
> +            {
> +                fprintf(stderr, "error: handshake with client failed\n");
> +            }
>          }
> -    } while (g_stay_alive);
> +    } while (g_server);
>
>      fprintf(stderr, "lldb-server exiting...\n");
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150325/cee943d8/attachment.html>


More information about the lldb-commits mailing list