[Lldb-commits] [PATCH] D77295: [lldb/Core] Fix a race in the Communication class

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Apr 6 06:27:54 PDT 2020


labath marked 3 inline comments as done.
labath added inline comments.


================
Comment at: lldb/source/Core/Communication.cpp:318
   bool done = false;
+  bool disconnect = false;
   while (!done && comm->m_read_thread_enabled) {
----------------
clayborg wrote:
> Can we just init "disconnect" right here?:
> 
> ```
> const bool disconnect = comm->GetCloseOnEOF();
> ```
> 
That won't work because we there are paths out of this function which should not disconnect (even in the close-on-eof case). For example, the read thread can be disabled by setting `comm->m_read_thread_enabled = false` in which case we should exit even though we have not reached EOF.


================
Comment at: lldb/source/Core/Communication.cpp:322-327
     if (bytes_read > 0)
       comm->AppendBytesToCache(buf, bytes_read, true, status);
     else if ((bytes_read == 0) && status == eConnectionStatusEndOfFile) {
-      if (comm->GetCloseOnEOF())
-        comm->Disconnect();
+      disconnect = comm->GetCloseOnEOF();
       comm->AppendBytesToCache(buf, bytes_read, true, status);
     }
----------------
clayborg wrote:
> Is there a reason we call AppendBytesToCache with zero bytes in the else? If we do need to call it (it might listen to the "status"?) then this:
> 
> ```
> if (bytes_read > 0)
>   comm->AppendBytesToCache(buf, bytes_read, true, status);
> else if ((bytes_read == 0) && status == eConnectionStatusEndOfFile) {
>   disconnect = comm->GetCloseOnEOF();
>   comm->AppendBytesToCache(buf, bytes_read, true, status);
> }
> ```
> can just be:
> 
> ```
> comm->AppendBytesToCache(buf, bytes_read, true, status);
> ```
> 
> bytes_read is a size_t so it can't be less than zero. Then we can move the "disconnect = comm->GetCloseOnEOF();" into the eConnectionStatusEndOfFile case in the switch below.
`AppendBytesToCache` calls a callback and I believe the idea is to call it with a 0-byte buffer on EOF. But the refactor looks good. I've made the `AppendBytesToCache` call conditional on `bytes_read > 0 || status == EOF` to preserve the existing behavior of not calling the callback in case of errors.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77295/new/

https://reviews.llvm.org/D77295





More information about the lldb-commits mailing list