LLDB mainline
lldb_private::PseudoConsole Class Reference

#include <PseudoConsole.h>

Public Types

enum class  Mode { ConPTY , Pipe , None }

Public Member Functions

 PseudoConsole ()=default
 ~PseudoConsole ()
 PseudoConsole (const PseudoConsole &)=delete
 PseudoConsole (PseudoConsole &&)=delete
PseudoConsole & operator= (const PseudoConsole &)=delete
PseudoConsole & operator= (PseudoConsole &&)=delete
llvm::Error CreateOverlappedPipePair (HANDLE &out_read, HANDLE &out_write, bool inheritable)
 Creates a named pipe pair for overlapped I/O.
llvm::Error OpenPseudoConsole (uint16_t req_cols=0, uint16_t req_rows=0)
 Creates and opens a new ConPTY instance with a default console size of 80x25.
llvm::Error OpenAnonymousPipes ()
 Creates a pair of anonymous pipes to use for stdio instead of a ConPTY.
void Close ()
 Closes the ConPTY and invalidates its handle, without closing the STDIN and STDOUT pipes.
void ClosePseudoConsolePipes ()
 Closes the STDIN and STDOUT pipe handles and invalidates them.
void CloseAnonymousPipes ()
 Closes the child-side pipe handles (stdin read end and stdout/stderr write end) that were passed to CreateProcessW.
void Reset ()
 Closes any open ConPTY/pipe handles and resets internal state to a freshly-constructed PseudoConsole.
bool IsConnected () const
 Returns whether the ConPTY and its pipes are currently open and valid.
HPCON GetPseudoTerminalHandle ()
 The ConPTY HPCON handle accessor.
HANDLE GetSTDOUTHandle () const
 The STDOUT read HANDLE accessor.
HANDLE GetSTDINHandle () const
 The STDIN write HANDLE accessor.
HANDLE GetChildStdinHandle () const
 The child-side stdin read HANDLE (pipe mode only).
HANDLE GetChildStdoutHandle () const
 The child-side stdout/stderr write HANDLE (pipe mode only).
Mode GetMode () const

Protected Attributes

HANDLE m_conpty_handle = reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
HANDLE m_conpty_output = reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
HANDLE m_conpty_input = reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
HANDLE m_pipe_child_stdin
HANDLE m_pipe_child_stdout
std::atomic< bool > m_pipes_closed = false
Mode m_mode = Mode::None
std::mutex m_mutex {}

Detailed Description

Definition at line 23 of file PseudoConsole.h.

Member Enumeration Documentation

◆ Mode

Enumerator
ConPTY 
Pipe 
None 

Definition at line 26 of file PseudoConsole.h.

Constructor & Destructor Documentation

◆ PseudoConsole() [1/3]

lldb_private::PseudoConsole::PseudoConsole ( )
default

◆ ~PseudoConsole()

PseudoConsole::~PseudoConsole ( )

Definition at line 94 of file PseudoConsole.cpp.

References Reset().

◆ PseudoConsole() [2/3]

lldb_private::PseudoConsole::PseudoConsole ( const PseudoConsole & )
delete

References PseudoConsole().

◆ PseudoConsole() [3/3]

lldb_private::PseudoConsole::PseudoConsole ( PseudoConsole && )
delete

References PseudoConsole().

Member Function Documentation

◆ Close()

void PseudoConsole::Close ( )

Closes the ConPTY and invalidates its handle, without closing the STDIN and STDOUT pipes.

Closing the ConPTY signals EOF to any process currently attached to it. The console host then writes its last frame to the STDOUT pipe and closes its end, so reading the pipe up to EOF gets all of the output.

In pipe mode there is no ConPTY to close: this cancels the read pending on the STDOUT pipe and marks the pipes closed, so IsConnected() returns false from then on, as it does once a ConPTY is closed.

Definition at line 186 of file PseudoConsole.cpp.

References kernel32, m_conpty_handle, m_conpty_output, m_mode, m_mutex, m_pipes_closed, and Pipe.

Referenced by Reset().

◆ CloseAnonymousPipes()

void PseudoConsole::CloseAnonymousPipes ( )

Closes the child-side pipe handles (stdin read end and stdout/stderr write end) that were passed to CreateProcessW.

Must be called after a successful CreateProcessW to avoid keeping the pipes alive indefinitely.

Definition at line 207 of file PseudoConsole.cpp.

References m_pipe_child_stdin, and m_pipe_child_stdout.

Referenced by Reset().

◆ ClosePseudoConsolePipes()

void PseudoConsole::ClosePseudoConsolePipes ( )

Closes the STDIN and STDOUT pipe handles and invalidates them.

Definition at line 197 of file PseudoConsole.cpp.

References m_conpty_input, and m_conpty_output.

Referenced by Reset().

◆ CreateOverlappedPipePair()

llvm::Error PseudoConsole::CreateOverlappedPipePair ( HANDLE & out_read,
HANDLE & out_write,
bool inheritable )

Creates a named pipe pair for overlapped I/O.

On failure any handles that were successfully opened are closed and an error is returned.

Definition at line 68 of file PseudoConsole.cpp.

References MAX_PATH.

Referenced by OpenAnonymousPipes(), and OpenPseudoConsole().

◆ GetChildStdinHandle()

HANDLE lldb_private::PseudoConsole::GetChildStdinHandle ( ) const
inline

The child-side stdin read HANDLE (pipe mode only).

Definition at line 114 of file PseudoConsole.h.

References m_pipe_child_stdin.

Referenced by lldb_private::ProcessLauncherWindows::LaunchProcess().

◆ GetChildStdoutHandle()

HANDLE lldb_private::PseudoConsole::GetChildStdoutHandle ( ) const
inline

The child-side stdout/stderr write HANDLE (pipe mode only).

Definition at line 117 of file PseudoConsole.h.

References m_pipe_child_stdout.

Referenced by lldb_private::ProcessLauncherWindows::LaunchProcess().

◆ GetMode()

Mode lldb_private::PseudoConsole::GetMode ( ) const
inline

Definition at line 119 of file PseudoConsole.h.

References m_mode.

◆ GetPseudoTerminalHandle()

HPCON lldb_private::PseudoConsole::GetPseudoTerminalHandle ( )
inline

The ConPTY HPCON handle accessor.

This object retains ownership of the HPCON when this accessor is used.

Returns
The ConPTY HPCON handle, or INVALID_HANDLE_VALUE if it is currently invalid.

Definition at line 93 of file PseudoConsole.h.

References m_conpty_handle.

◆ GetSTDINHandle()

HANDLE lldb_private::PseudoConsole::GetSTDINHandle ( ) const
inline

The STDIN write HANDLE accessor.

This object retains ownership of the HANDLE when this accessor is used.

Returns
The STDIN write HANDLE, or INVALID_HANDLE_VALUE if it is currently invalid.

Definition at line 111 of file PseudoConsole.h.

References m_conpty_input.

◆ GetSTDOUTHandle()

HANDLE lldb_private::PseudoConsole::GetSTDOUTHandle ( ) const
inline

The STDOUT read HANDLE accessor.

This object retains ownership of the HANDLE when this accessor is used.

Returns
The STDOUT read HANDLE, or INVALID_HANDLE_VALUE if it is currently invalid.

Definition at line 102 of file PseudoConsole.h.

References m_conpty_output.

◆ IsConnected()

bool PseudoConsole::IsConnected ( ) const

Returns whether the ConPTY and its pipes are currently open and valid.

Definition at line 177 of file PseudoConsole.cpp.

References m_conpty_handle, m_conpty_input, m_conpty_output, m_mode, m_pipes_closed, and Pipe.

◆ OpenAnonymousPipes()

llvm::Error PseudoConsole::OpenAnonymousPipes ( )

Creates a pair of anonymous pipes to use for stdio instead of a ConPTY.

Returns
An llvm::Error if the pipes could not be created.

Definition at line 225 of file PseudoConsole.cpp.

References CreateOverlappedPipePair(), m_conpty_input, m_conpty_output, m_mode, m_pipe_child_stdin, m_pipe_child_stdout, Pipe, and Reset().

◆ OpenPseudoConsole()

llvm::Error PseudoConsole::OpenPseudoConsole ( uint16_t req_cols = 0,
uint16_t req_rows = 0 )

Creates and opens a new ConPTY instance with a default console size of 80x25.

Also sets up the associated STDIN/STDOUT pipes and responds to the cursor-position query that ConPTY emits at startup.

Parameters
req_cols,req_rowsOptional terminal dimensions.
Returns
An llvm::Error if the ConPTY could not be created, or if ConPTY is not available on this version of Windows, llvm::Error::success() otherwise.

Definition at line 96 of file PseudoConsole.cpp.

References ConPTY, CreateOverlappedPipePair(), kernel32, m_conpty_handle, m_conpty_input, m_conpty_output, m_mode, MAX_PATH, PSEUDOCONSOLE_INHERIT_CURSOR, and Reset().

◆ operator=() [1/2]

PseudoConsole & lldb_private::PseudoConsole::operator= ( const PseudoConsole & )
delete

References PseudoConsole().

◆ operator=() [2/2]

PseudoConsole & lldb_private::PseudoConsole::operator= ( PseudoConsole && )
delete

References PseudoConsole().

◆ Reset()

void PseudoConsole::Reset ( )

Closes any open ConPTY/pipe handles and resets internal state to a freshly-constructed PseudoConsole.

Definition at line 217 of file PseudoConsole.cpp.

References Close(), CloseAnonymousPipes(), ClosePseudoConsolePipes(), m_mode, m_pipes_closed, and None.

Referenced by OpenAnonymousPipes(), OpenPseudoConsole(), and ~PseudoConsole().

Member Data Documentation

◆ m_conpty_handle

HANDLE lldb_private::PseudoConsole::m_conpty_handle = reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
protected

Definition at line 122 of file PseudoConsole.h.

Referenced by Close(), GetPseudoTerminalHandle(), IsConnected(), and OpenPseudoConsole().

◆ m_conpty_input

HANDLE lldb_private::PseudoConsole::m_conpty_input = reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
protected

◆ m_conpty_output

HANDLE lldb_private::PseudoConsole::m_conpty_output = reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
protected

◆ m_mode

Mode lldb_private::PseudoConsole::m_mode = Mode::None
protected

◆ m_mutex

std::mutex lldb_private::PseudoConsole::m_mutex {}
protected

Definition at line 135 of file PseudoConsole.h.

Referenced by Close().

◆ m_pipe_child_stdin

HANDLE lldb_private::PseudoConsole::m_pipe_child_stdin
protected
Initial value:
=
reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))
void * HANDLE

Definition at line 126 of file PseudoConsole.h.

Referenced by CloseAnonymousPipes(), GetChildStdinHandle(), and OpenAnonymousPipes().

◆ m_pipe_child_stdout

HANDLE lldb_private::PseudoConsole::m_pipe_child_stdout
protected
Initial value:
=
reinterpret_cast<HANDLE>(static_cast<intptr_t>(-1))

Definition at line 128 of file PseudoConsole.h.

Referenced by CloseAnonymousPipes(), GetChildStdoutHandle(), and OpenAnonymousPipes().

◆ m_pipes_closed

std::atomic<bool> lldb_private::PseudoConsole::m_pipes_closed = false
protected

Definition at line 133 of file PseudoConsole.h.

Referenced by Close(), IsConnected(), and Reset().


The documentation for this class was generated from the following files: