| // 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/forensics/exceptions/handler_manager.h" |
| |
| namespace forensics { |
| namespace exceptions { |
| |
| HandlerManager::HandlerManager(async_dispatcher_t* dispatcher, size_t max_num_handlers, |
| zx::duration exception_ttl) |
| : dispatcher_(dispatcher), exception_ttl_(exception_ttl) { |
| handlers_.reserve(max_num_handlers); |
| for (size_t i = 0; i < max_num_handlers; ++i) { |
| handlers_.emplace_back(dispatcher_, /*on_available=*/[i, this] { |
| // Push to the front so already initialized handlers are used first. |
| available_handlers_.push_front(i); |
| HandleNextPendingException(); |
| }); |
| available_handlers_.emplace_back(i); |
| } |
| } |
| |
| void HandlerManager::Handle(zx::exception exception) { |
| pending_exceptions_.emplace_back(dispatcher_, exception_ttl_, std::move(exception)); |
| HandleNextPendingException(); |
| } |
| |
| void HandlerManager::HandleNextPendingException() { |
| if (pending_exceptions_.empty() || available_handlers_.empty()) { |
| return; |
| } |
| |
| // We must reserve all state needed to handle the exception (the handler and the exception) and |
| // remove it from the queues prior to actually handling the exception. This is done to prevent |
| // that state from being erroneously being reused when ProcessHandler::Handle ends up calling |
| // HandleNextPendingException on a failure. |
| const size_t handler_idx = available_handlers_.front(); |
| available_handlers_.pop_front(); |
| |
| zx::exception exception = pending_exceptions_.front().TakeException(); |
| zx::process process = pending_exceptions_.front().TakeProcess(); |
| zx::thread thread = pending_exceptions_.front().TakeThread(); |
| |
| pending_exceptions_.pop_front(); |
| |
| handlers_[handler_idx].Handle(std::move(exception), std::move(process), std::move(thread)); |
| } |
| |
| } // namespace exceptions |
| } // namespace forensics |