| // 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; | |
| } | |
| Console::~Console() { | |
| FX_DCHECK(singleton_ == this); | |
| singleton_ = nullptr; | |
| // 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); | |
| } | |
| } | |
| } // namespace zxdb |