| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/developer/debug/zxdb/console/console.h" |
| |
| #include "src/developer/debug/zxdb/console/async_output_buffer.h" |
| #include "src/developer/debug/zxdb/console/command_parser.h" |
| #include "src/developer/debug/zxdb/console/output_buffer.h" |
| |
| namespace zxdb { |
| |
| Console* Console::singleton_ = nullptr; |
| |
| Console::Console(Session* session) : context_(session), weak_factory_(this) { |
| FX_DCHECK(!singleton_); |
| singleton_ = this; |
| debug::LogSink::Set(this); |
| } |
| |
| Console::~Console() { |
| FX_DCHECK(singleton_ == this); |
| singleton_ = nullptr; |
| debug::LogSink::Unset(); |
| |
| // Clear backpointers bound with the callbacks for any pending async buffers. |
| for (auto& pair : async_output_) |
| pair.second->SetCompletionCallback({}); |
| } |
| |
| fxl::WeakPtr<Console> Console::GetWeakPtr() { return weak_factory_.GetWeakPtr(); } |
| |
| void Console::Output(const std::string& s) { |
| OutputBuffer buffer; |
| buffer.Append(s); |
| Output(buffer); |
| } |
| |
| void Console::Output(const Err& err) { |
| OutputBuffer buffer; |
| buffer.Append(err); |
| Output(buffer); |
| } |
| |
| void Console::Output(fxl::RefPtr<AsyncOutputBuffer> output) { |
| if (output->is_complete()) { |
| // Synchronously available. |
| Output(output->DestructiveFlatten()); |
| } else { |
| // Listen for completion. |
| // |
| // Binds |this|. On our destruction we'll clear all the callbacks to prevent dangling pointers |
| // for anything not completed yet. |
| AsyncOutputBuffer* output_ptr = output.get(); |
| output->SetCompletionCallback([this, output_ptr]() { |
| Output(output_ptr->DestructiveFlatten()); |
| |
| auto found = async_output_.find(output_ptr); |
| FX_DCHECK(found != async_output_.end()); |
| |
| // Clear the completion callback out of paranoia. |
| async_output_.erase(found); |
| }); |
| async_output_[output_ptr] = std::move(output); |
| } |
| } |
| |
| void Console::WriteLog(debug::LogSeverity severity, std::string log) { |
| static const Syntax kSeveritySyntaxes[] = {Syntax::kComment, Syntax::kWarning, Syntax::kError}; |
| Output(OutputBuffer(kSeveritySyntaxes[static_cast<int>(severity)], std::move(log))); |
| } |
| |
| } // namespace zxdb |