| // Copyright 2020 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/debug_agent/mock_limbo_provider.h" | |
| namespace debug_agent { | |
| bool MockLimboProvider::IsProcessInLimbo(zx_koid_t process_koid) const { | |
| const auto& records = GetLimboRecords(); | |
| return records.find(process_koid) != records.end(); | |
| } | |
| const LimboProvider::RecordMap& MockLimboProvider::GetLimboRecords() const { | |
| // Recreate limbo_ contents from the current mock records. | |
| limbo_.clear(); | |
| for (const auto& [process_koid, mock_record] : mock_records_) | |
| limbo_[mock_record.process.GetKoid()] = FromMockRecord(mock_record); | |
| return limbo_; | |
| } | |
| fitx::result<zx_status_t, LimboProvider::RetrievedException> MockLimboProvider::RetrieveException( | |
| zx_koid_t process_koid) { | |
| auto it = mock_records_.find(process_koid); | |
| if (it == mock_records_.end()) | |
| return fitx::error(ZX_ERR_NOT_FOUND); | |
| RetrievedException result; | |
| result.process = std::make_unique<MockProcessHandle>(it->second.process); | |
| result.thread = std::make_unique<MockThreadHandle>(it->second.thread); | |
| result.exception = std::make_unique<MockExceptionHandle>(it->second.exception); | |
| mock_records_.erase(it); | |
| limbo_.erase(process_koid); | |
| return fitx::ok(std::move(result)); | |
| } | |
| zx_status_t MockLimboProvider::ReleaseProcess(zx_koid_t process_koid) { | |
| release_calls_.push_back(process_koid); | |
| auto it = mock_records_.find(process_koid); | |
| if (it == mock_records_.end()) | |
| return ZX_ERR_NOT_FOUND; | |
| mock_records_.erase(it); | |
| limbo_.erase(process_koid); | |
| return ZX_OK; | |
| } | |
| void MockLimboProvider::AppendException(MockProcessHandle process, MockThreadHandle thread, | |
| MockExceptionHandle exception) { | |
| zx_koid_t process_koid = process.GetKoid(); | |
| mock_records_.insert( | |
| {process_koid, MockRecord(std::move(process), std::move(thread), std::move(exception))}); | |
| } | |
| void MockLimboProvider::CallOnEnterLimbo() { | |
| FX_DCHECK(on_enter_limbo_); | |
| // The callback may mutate the list from under us, so make a copy of what to call. | |
| auto record_copy = mock_records_; | |
| for (const auto& [process_koid, mock_record] : record_copy) | |
| on_enter_limbo_(FromMockRecord(mock_record)); | |
| } | |
| LimboProvider::Record MockLimboProvider::FromMockRecord(const MockRecord& mock) { | |
| Record record; | |
| record.process = std::make_unique<MockProcessHandle>(mock.process); | |
| record.thread = std::make_unique<MockThreadHandle>(mock.thread); | |
| return record; | |
| } | |
| } // namespace debug_agent |