blob: cb2126f884b45b7cba96181940d818cfd699bf47 [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/forensics/exceptions/pending_exception.h"
#include <lib/syslog/cpp/macros.h>
#include <lib/zx/process.h>
#include <lib/zx/thread.h>
namespace forensics {
namespace exceptions {
PendingException::PendingException(async_dispatcher_t* dispatcher, zx::duration ttl,
zx::exception exception)
: exception_(std::move(exception)), process_(ZX_HANDLE_INVALID), thread_(ZX_HANDLE_INVALID) {
if (!exception_.is_valid()) {
return;
}
if (const zx_status_t status = exception_.get_process(&process_); status != ZX_OK) {
FX_PLOGS(ERROR, status) << "Failed to get process; releasing the exception";
exception_.reset();
}
if (const zx_status_t status = exception_.get_thread(&thread_); status != ZX_OK) {
FX_PLOGS(ERROR, status) << "Failed to get thread; releasing the exception";
exception_.reset();
}
if (const zx_status_t status = reset_.PostDelayed(dispatcher, ttl); status != ZX_OK) {
FX_PLOGS(ERROR, status) << "Failed to post reset task for exception; releasing the exception";
exception_.reset();
}
}
zx::exception&& PendingException::TakeException() { return std::move(exception_); }
zx::process&& PendingException::TakeProcess() { return std::move(process_); }
zx::thread&& PendingException::TakeThread() { return std::move(thread_); }
void PendingException::Reset() { exception_.reset(); }
} // namespace exceptions
} // namespace forensics