Skip to content

Commit 0716b13

Browse files
committed
Tie stdout and stderr together
1 parent 83a5948 commit 0716b13

File tree

7 files changed

+44
-21
lines changed

7 files changed

+44
-21
lines changed

lldb/include/lldb/Core/Debugger.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
691691
lldb::FileSP m_input_file_sp;
692692
lldb::LockableStreamFileSP m_output_stream_sp;
693693
lldb::LockableStreamFileSP m_error_stream_sp;
694+
LockableStreamFile::Mutex m_output_mutex;
694695

695696
/// Used for shadowing the input file when capturing a reproducer.
696697
repro::DataRecorder *m_input_recorder;

lldb/include/lldb/Host/File.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ class File : public IOObject {
377377

378378
class NativeFile : public File {
379379
public:
380+
enum TransferOwnership : bool {
381+
Owned = true,
382+
Unowned = false,
383+
};
384+
380385
NativeFile() : m_descriptor(kInvalidDescriptor), m_stream(kInvalidStream) {}
381386

382387
NativeFile(FILE *fh, bool transfer_ownership)

lldb/include/lldb/Host/StreamFile.h

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <cstdint>
1919
#include <cstdio>
2020
#include <memory>
21+
#include <mutex>
2122

2223
namespace lldb_private {
2324

@@ -70,13 +71,17 @@ class LockedStreamFile : public StreamFile {
7071

7172
class LockableStreamFile {
7273
public:
73-
LockableStreamFile(std::shared_ptr<StreamFile> stream_file_sp)
74-
: m_file_sp(stream_file_sp->GetFileSP()) {}
75-
LockableStreamFile(StreamFile &stream_file)
76-
: m_file_sp(stream_file.GetFileSP()) {}
77-
LockableStreamFile(FILE *fh, bool transfer_ownership)
78-
: m_file_sp(std::make_shared<NativeFile>(fh, transfer_ownership)) {}
79-
LockableStreamFile(std::shared_ptr<File> file_sp) : m_file_sp(file_sp) {}
74+
using Mutex = std::recursive_mutex;
75+
76+
LockableStreamFile(std::shared_ptr<StreamFile> stream_file_sp, Mutex &mutex)
77+
: m_file_sp(stream_file_sp->GetFileSP()), m_mutex(mutex) {}
78+
LockableStreamFile(StreamFile &stream_file, Mutex &mutex)
79+
: m_file_sp(stream_file.GetFileSP()), m_mutex(mutex) {}
80+
LockableStreamFile(FILE *fh, bool transfer_ownership, Mutex &mutex)
81+
: m_file_sp(std::make_shared<NativeFile>(fh, transfer_ownership)),
82+
m_mutex(mutex) {}
83+
LockableStreamFile(std::shared_ptr<File> file_sp, Mutex &mutex)
84+
: m_file_sp(file_sp), m_mutex(mutex) {}
8085

8186
LockedStreamFile Lock() { return LockedStreamFile(m_file_sp, m_mutex); }
8287

@@ -87,11 +92,11 @@ class LockableStreamFile {
8792
std::shared_ptr<File> GetUnlockedFileSP() { return m_file_sp; }
8893
/// @}
8994

90-
std::recursive_mutex &GetMutex() { return m_mutex; }
95+
Mutex &GetMutex() { return m_mutex; }
9196

9297
protected:
9398
std::shared_ptr<File> m_file_sp;
94-
std::recursive_mutex m_mutex;
99+
Mutex &m_mutex;
95100

96101
private:
97102
LockableStreamFile(const LockableStreamFile &) = delete;

lldb/include/lldb/Interpreter/ScriptInterpreter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class ScriptInterpreterIORedirect {
134134
lldb::FileSP m_input_file_sp;
135135
lldb::LockableStreamFileSP m_output_file_sp;
136136
lldb::LockableStreamFileSP m_error_file_sp;
137+
LockableStreamFile::Mutex m_output_mutex;
137138
ThreadedCommunication m_communication;
138139
bool m_disconnect;
139140
};

lldb/source/Core/Debugger.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -873,9 +873,11 @@ llvm::StringRef Debugger::GetStaticBroadcasterClass() {
873873
Debugger::Debugger(lldb::LogOutputCallback log_callback, void *baton)
874874
: UserID(g_unique_id++),
875875
Properties(std::make_shared<OptionValueProperties>()),
876-
m_input_file_sp(std::make_shared<NativeFile>(stdin, false)),
877-
m_output_stream_sp(std::make_shared<LockableStreamFile>(stdout, false)),
878-
m_error_stream_sp(std::make_shared<LockableStreamFile>(stderr, false)),
876+
m_input_file_sp(std::make_shared<NativeFile>(stdin, NativeFile::Unowned)),
877+
m_output_stream_sp(std::make_shared<LockableStreamFile>(
878+
stdout, NativeFile::Unowned, m_output_mutex)),
879+
m_error_stream_sp(std::make_shared<LockableStreamFile>(
880+
stderr, NativeFile::Unowned, m_output_mutex)),
879881
m_input_recorder(nullptr),
880882
m_broadcaster_manager_sp(BroadcasterManager::MakeBroadcasterManager()),
881883
m_terminal_state(), m_target_list(*this), m_platform_list(),
@@ -1083,12 +1085,14 @@ void Debugger::SetInputFile(FileSP file_sp) {
10831085

10841086
void Debugger::SetOutputFile(FileSP file_sp) {
10851087
assert(file_sp && file_sp->IsValid());
1086-
m_output_stream_sp = std::make_shared<LockableStreamFile>(file_sp);
1088+
m_output_stream_sp =
1089+
std::make_shared<LockableStreamFile>(file_sp, m_output_mutex);
10871090
}
10881091

10891092
void Debugger::SetErrorFile(FileSP file_sp) {
10901093
assert(file_sp && file_sp->IsValid());
1091-
m_error_stream_sp = std::make_shared<LockableStreamFile>(file_sp);
1094+
m_error_stream_sp =
1095+
std::make_shared<LockableStreamFile>(file_sp, m_output_mutex);
10921096
}
10931097

10941098
void Debugger::SaveInputTerminalState() {
@@ -1244,7 +1248,7 @@ void Debugger::AdoptTopIOHandlerFilesIfInvalid(FileSP &in,
12441248
in = GetInputFileSP();
12451249
// If there is nothing, use stdin
12461250
if (!in)
1247-
in = std::make_shared<NativeFile>(stdin, false);
1251+
in = std::make_shared<NativeFile>(stdin, NativeFile::Unowned);
12481252
}
12491253
// If no STDOUT has been set, then set it appropriately
12501254
if (!out || !out->GetUnlockedFile().IsValid()) {
@@ -1254,7 +1258,8 @@ void Debugger::AdoptTopIOHandlerFilesIfInvalid(FileSP &in,
12541258
out = GetOutputStreamSP();
12551259
// If there is nothing, use stdout
12561260
if (!out)
1257-
out = std::make_shared<LockableStreamFile>(stdout, false);
1261+
out = std::make_shared<LockableStreamFile>(stdout, NativeFile::Unowned,
1262+
m_output_mutex);
12581263
}
12591264
// If no STDERR has been set, then set it appropriately
12601265
if (!err || !err->GetUnlockedFile().IsValid()) {
@@ -1264,7 +1269,8 @@ void Debugger::AdoptTopIOHandlerFilesIfInvalid(FileSP &in,
12641269
err = GetErrorStreamSP();
12651270
// If there is nothing, use stderr
12661271
if (!err)
1267-
err = std::make_shared<LockableStreamFile>(stderr, false);
1272+
err = std::make_shared<LockableStreamFile>(stderr, NativeFile::Unowned,
1273+
m_output_mutex);
12681274
}
12691275
}
12701276

lldb/source/Interpreter/ScriptInterpreter.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ ScriptInterpreterIORedirect::Create(bool enable_io, Debugger &debugger,
206206
ScriptInterpreterIORedirect::ScriptInterpreterIORedirect(
207207
std::unique_ptr<File> input, std::unique_ptr<File> output)
208208
: m_input_file_sp(std::move(input)),
209-
m_output_file_sp(std::make_shared<LockableStreamFile>(std::move(output))),
209+
m_output_file_sp(std::make_shared<LockableStreamFile>(std::move(output),
210+
m_output_mutex)),
210211
m_error_file_sp(m_output_file_sp),
211212
m_communication("lldb.ScriptInterpreterIORedirect.comm"),
212213
m_disconnect(false) {}
@@ -241,7 +242,8 @@ ScriptInterpreterIORedirect::ScriptInterpreterIORedirect(
241242

242243
FILE *outfile_handle = fdopen(pipe.ReleaseWriteFileDescriptor(), "w");
243244
m_output_file_sp = std::make_shared<LockableStreamFile>(
244-
std::make_shared<StreamFile>(outfile_handle, true));
245+
std::make_shared<StreamFile>(outfile_handle, NativeFile::Owned),
246+
m_output_mutex);
245247
m_error_file_sp = m_output_file_sp;
246248
if (outfile_handle)
247249
::setbuf(outfile_handle, nullptr);

lldb/unittests/Editline/EditlineTest.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "lldb/Host/Config.h"
10+
#include "lldb/Host/File.h"
1011

1112
#if LLDB_ENABLE_LIBEDIT
1213

@@ -117,9 +118,11 @@ EditlineAdapter::EditlineAdapter()
117118
return;
118119

119120
lldb::LockableStreamFileSP output_stream_sp =
120-
std::make_shared<LockableStreamFile>(*_el_secondary_file, false);
121+
std::make_shared<LockableStreamFile>(*_el_secondary_file,
122+
NativeFile::Unowned, output_mutex);
121123
lldb::LockableStreamFileSP error_stream_sp =
122-
std::make_shared<LockableStreamFile>(*_el_secondary_file, false);
124+
std::make_shared<LockableStreamFile>(*_el_secondary_file,
125+
NativeFile::Unowned, output_mutex);
123126

124127
// Create an Editline instance.
125128
_editline_sp.reset(new lldb_private::Editline(

0 commit comments

Comments
 (0)