diff options
author | Zachary Turner <zturner@google.com> | 2019-03-07 21:23:21 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2019-03-07 21:23:21 +0000 |
commit | 29e8754172031ed217d25e3de0bc4047192a3453 (patch) | |
tree | a937f8971212dcbd47fc516d9b3cb4fbf1255b58 /lldb/tools/lldb-vscode/IOStream.h | |
parent | d0c2dba644e27210ed13cd638aa8b8e677ed757d (diff) | |
download | bcm5719-llvm-29e8754172031ed217d25e3de0bc4047192a3453.tar.gz bcm5719-llvm-29e8754172031ed217d25e3de0bc4047192a3453.zip |
[lldb-vscode] Support running in server mode on Windows.
Windows can't use standard i/o system calls such as read and write
to work with sockets, it instead needs to use the specific send
and recv calls. This complicates matters for the debug adapter,
since it needs to be able to work in both server mode where it
communicates over a socket, as well as non-server mode where it
communicates via stdin and stdout. To abstract this out, I've
introduced a class IOStream which hides all these details and
exposes a read/write interface that does the right on each
platform.
Differential Revision: https://reviews.llvm.org/D59104
llvm-svn: 355637
Diffstat (limited to 'lldb/tools/lldb-vscode/IOStream.h')
-rw-r--r-- | lldb/tools/lldb-vscode/IOStream.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lldb/tools/lldb-vscode/IOStream.h b/lldb/tools/lldb-vscode/IOStream.h new file mode 100644 index 00000000000..8414c09e9fe --- /dev/null +++ b/lldb/tools/lldb-vscode/IOStream.h @@ -0,0 +1,69 @@ +//===-- IOStream.h ----------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDBVSCODE_IOSTREAM_H_ +#define LLDBVSCODE_IOSTREAM_H_ + +#if defined(_WIN32) +// We need to #define NOMINMAX in order to skip `min()` and `max()` macro +// definitions that conflict with other system headers. +// We also need to #undef GetObject (which is defined to GetObjectW) because +// the JSON code we use also has methods named `GetObject()` and we conflict +// against these. +#define NOMINMAX +#include <windows.h> +#else +typedef int SOCKET; +#endif + +#include "llvm/ADT/StringRef.h" + +#include <fstream> +#include <string> + +// Windows requires different system calls for dealing with sockets and other +// types of files, so we can't simply have one code path that just uses read +// and write everywhere. So we need an abstraction in order to allow us to +// treat them identically. +namespace lldb_vscode { +struct StreamDescriptor { + StreamDescriptor(); + ~StreamDescriptor(); + StreamDescriptor(StreamDescriptor &&other); + + StreamDescriptor &operator=(StreamDescriptor &&other); + + static StreamDescriptor from_socket(SOCKET s, bool close); + static StreamDescriptor from_file(int fd, bool close); + + bool m_is_socket = false; + bool m_close = false; + union { + int m_fd; + SOCKET m_socket; + }; +}; + +struct InputStream { + StreamDescriptor descriptor; + + bool read_full(std::ofstream *log, size_t length, std::string &text); + + bool read_line(std::ofstream *log, std::string &line); + + bool read_expected(std::ofstream *log, llvm::StringRef expected); +}; + +struct OutputStream { + StreamDescriptor descriptor; + + bool write_full(llvm::StringRef str); +}; +} // namespace lldb_vscode + +#endif |