blob: 654a294c84c45443ed04e7499e25317946d396cd [file] [log] [blame]
// 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.
#ifndef LIB_ASYNC_EXCEPTION_H_
#define LIB_ASYNC_EXCEPTION_H_
#include <lib/async/dispatcher.h>
__BEGIN_CDECLS
// Handles receipt of packets containing exception reports.
//
// The |status| is |ZX_OK| if the packet was successfully delivered and |data|
// contains the information from the packet, otherwise |data| is null.
// The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down.
typedef void(async_exception_handler_t)(async_dispatcher_t* dispatcher,
async_exception_t* exception,
zx_status_t status,
const zx_port_packet_t* report);
// Holds content for an exception packet receiver and its handler.
//
// The client is responsible for retaining the structure in memory
// (and unmodified) until all packets have been received by the handler or the
// dispatcher shuts down.
//
// Multiple packets may be delivered to the same receiver concurrently.
struct async_exception {
// Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
async_state_t state;
// The handler to invoke when a packet is received.
async_exception_handler_t* handler;
// The task we're watching.
zx_handle_t task;
// The options to pass to zx_task_bind_exception_port().
uint32_t options;
};
// Bind the async port to the task's exception port.
//
// Returns |ZX_OK| if task's exception port was successfully bound to.
// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
// Other error values are possible. See the documentation for
// |zx_task_bind_exception_port()|.
//
// This operation is thread-safe.
zx_status_t async_bind_exception_port(async_dispatcher_t* dispatcher,
async_exception_t* exception);
// Unbind the async port from |task|'s exception port.
//
// Returns |ZX_OK| if the task's exception port was successfully unbound.
// Returns |ZX_ERR_NOT_FOUND| if the port is not bound.
// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
// Other error values are possible. See the documentation for
// |zx_task_bind_exception_port()|.
//
// This operation is thread-safe.
zx_status_t async_unbind_exception_port(async_dispatcher_t* dispatcher,
async_exception_t* exception);
// Resume |task| after having processed an exception for it.
// |options| is passed to |zx_task_resume_from_exception()|.
//
// Returns |ZX_OK| if the task was resumed.
// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
// Other error values are possible. See the documentation for
// |zx_task_resume_from_exception()|.
//
// This operation is thread-safe.
zx_status_t async_resume_from_exception(async_dispatcher_t* dispatcher,
async_exception_t* exception,
zx_handle_t task,
uint32_t options);
__END_CDECLS
#endif // LIB_ASYNC_EXCEPTION_H_