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
70 lines
1.9 KiB
C++
70 lines
1.9 KiB
C++
//===-- 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
|