blob: cde4743b79a7e3c7e28d5e54e5e9543106dd34f8 [file] [log] [blame]
// 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