[Lldb-commits] [lldb] r223251 - Use timeout when reading debugserver's port from a named pipe.

Zachary Turner zturner at google.com
Wed Dec 3 17:03:33 PST 2014


I took another look at the implementations.  Pipe does not expose a method
that will do what we want.  I think the correct fix is to add an overload
of Read() to PipePosix.h that specifies a timeout.  In the overloaded
version, you call this select.  I will implement the equivalent overload on
Windows so that everything will work.

Thoughts?

On Wed Dec 03 2014 at 4:55:17 PM Zachary Turner <zturner at google.com> wrote:

> This breaks the Windows build.  For starters, Windows doesn't have
> sys/select.h.  Secondly, although Windows doesn't currently use llgs, it
> will in the future.  And select() on Windows does not work with Pipes.
>
> Can we revert this change?  We have lldb/Host/Pipe.h that should be used
> for pipes instead of File.  On Windows this is implemented in such a way
> that it's possible to get non-blocking behavior without select, and on
> posix I believe it uses select.
>
> On Wed Dec 03 2014 at 10:25:23 AM Oleksiy Vyalov <ovyalov at google.com>
> wrote:
>
>> Author: ovyalov
>> Date: Wed Dec  3 12:19:16 2014
>> New Revision: 223251
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=223251&view=rev
>> Log:
>> Use timeout when reading debugserver's port from a named pipe.
>>
>> http://reviews.llvm.org/D6490
>>
>>
>> Modified:
>>     lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommun
>> ication.cpp
>>
>> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommun
>> ication.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugin
>> s/Process/gdb-remote/GDBRemoteCommunication.cpp?rev=223251&r1=223250&r2=
>> 223251&view=diff
>> ============================================================
>> ==================
>> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
>> (original)
>> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
>> Wed Dec  3 12:19:16 2014
>> @@ -13,6 +13,7 @@
>>  // C Includes
>>  #include <limits.h>
>>  #include <string.h>
>> +#include <sys/select.h>
>>  #include <sys/stat.h>
>>
>>  // C++ Includes
>> @@ -42,6 +43,50 @@
>>  using namespace lldb;
>>  using namespace lldb_private;
>>
>> +namespace
>> +{
>> +
>> +Error
>> +ReadPortFromPipe (const char *const named_pipe_path, uint16_t& port,
>> const int timeout_secs)
>> +{
>> +    File name_pipe_file;
>> +    auto error = name_pipe_file.Open (named_pipe_path,
>> File::eOpenOptionRead | File::eOpenOptionNonBlocking);
>> +    if (error.Fail ())
>> +        return error;
>> +
>> +    struct timeval tv = {timeout_secs, 0};
>> +    const auto pipe_handle = name_pipe_file.GetWaitableHandle ();
>> +    fd_set rfds;
>> +    FD_ZERO(&rfds);
>> +    FD_SET(pipe_handle, &rfds);
>> +
>> +    const auto retval = ::select (pipe_handle + 1, &rfds, NULL, NULL,
>> &tv);
>> +    if (retval == -1)
>> +    {
>> +        error.SetErrorToErrno ();
>> +        return error;
>> +    }
>> +    if (retval == 0)
>> +    {
>> +        error.SetErrorString ("timeout exceeded");
>> +        return error;
>> +    }
>> +
>> +    char port_cstr[256];
>> +    port_cstr[0] = '\0';
>> +    size_t num_bytes = sizeof(port_cstr);
>> +    error = name_pipe_file.Read (port_cstr, num_bytes);
>> +
>> +    if (error.Success ())
>> +    {
>> +        assert (num_bytes > 0 && port_cstr[num_bytes-1] == '\0');
>> +        port = Args::StringToUInt32 (port_cstr, 0);
>> +    }
>> +    return error;
>> +}
>> +
>> +}
>> +
>>  GDBRemoteCommunication::History::History (uint32_t size) :
>>      m_packets(),
>>      m_curr_idx (0),
>> @@ -872,25 +917,23 @@ GDBRemoteCommunication::StartDebugserver
>>          launch_info.AppendSuppressFileAction (STDIN_FILENO, true,
>> false);
>>          launch_info.AppendSuppressFileAction (STDOUT_FILENO, false,
>> true);
>>          launch_info.AppendSuppressFileAction (STDERR_FILENO, false,
>> true);
>> -
>> +
>>          error = Host::LaunchProcess(launch_info);
>> -
>> +
>>          if (error.Success() && launch_info.GetProcessID() !=
>> LLDB_INVALID_PROCESS_ID)
>>          {
>>              if (named_pipe_path[0])
>>              {
>> -                File name_pipe_file;
>> -                error = name_pipe_file.Open(named_pipe_path,
>> File::eOpenOptionRead);
>> +                error = ReadPortFromPipe(named_pipe_path, out_port, 10);
>>                  if (error.Success())
>>                  {
>> -                    char port_cstr[256];
>> -                    port_cstr[0] = '\0';
>> -                    size_t num_bytes = sizeof(port_cstr);
>> -                    error = name_pipe_file.Read(port_cstr, num_bytes);
>> -                    assert (error.Success());
>> -                    assert (num_bytes > 0 && port_cstr[num_bytes-1] ==
>> '\0');
>> -                    out_port = Args::StringToUInt32(port_cstr, 0);
>> -                    name_pipe_file.Close();
>> +                    if (log)
>> +                        log->Printf("GDBRemoteCommunication::%s()
>> debugserver listens %u port", __FUNCTION__, out_port);
>> +                }
>> +                else
>> +                {
>> +                    if (log)
>> +                        log->Printf("GDBRemoteCommunication::%s()
>> failed to read a port value from named pipe %s: %s", __FUNCTION__,
>> named_pipe_path, error.AsCString());
>>                  }
>>                  FileSystem::Unlink(named_pipe_path);
>>              }
>>
>>
>> _______________________________________________
>> 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/20141204/90bace95/attachment.html>


More information about the lldb-commits mailing list