blob: ab7e05b09b5e60694c771dfa17e23e330efed72d [file] [log] [blame]
// Copyright 2019 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.
library fuchsia.exception;
using zx;
/// The maximum amount of exceptions that will be listed at any given time by a
/// call to |ListProcessesWaitingOnException|.
const uint64 MAX_EXCEPTIONS_PER_CALL = 32;
const uint64 MAX_FILTER_LENGTH = 32;
const uint64 MAX_FILTERS_PER_CALL = 32;
/// Protocol meant for clients interested in obtaining processes that are
/// suspended waiting for an exception handler (in limbo). This is the core
/// feature that enables Just In Time (JIT) debugging.
[Discoverable]
protocol ProcessLimbo {
/// Watchs for changes determining whether the limbo is currently active,
/// using a Hanging Get pattern. An active limbo could be empty (not have
/// any processes waiting on an exception). However, an inactive limbo is
/// guaranteed to not have any processes waiting in it.
WatchActive() -> (bool is_active);
/// Watch for processes that are waiting on exceptions, using a Hanging Get
/// Pattern.
///
/// Returns information on all the processes currently waiting on an exception.
/// The information provided is intended to correctly identify an exception
/// and determine whether the caller wants to actually handle it.
/// To retrieve an exception, use the |GetException| call.
///
/// Returns ZX_ERR_UNAVAILABLE if limbo is not active.
/// Returns ZX_ERR_CANCELED if there was an outstanding call and the limbo
/// becomes inactive.
///
/// NOTE: The |process| and |thread| handle will only have the ZX_RIGHT_READ
/// right, so no modification will be able to be done on them.
WatchProcessesWaitingOnException() -> (vector<ProcessExceptionMetadata>:MAX_EXCEPTIONS_PER_CALL exception_list) error zx.status;
/// Removes the process from limbo and retrieves the exception handle and
/// associated metadata from an exception.
///
/// Use |ListProcessesWaitingOnException| to choose a |process_koid| from the
/// list of available exceptions.
///
/// Returns ZX_ERR_NOT_FOUND if the process is not waiting on an exception.
/// Returns ZX_ERR_UNAVAILABLE if limbo is not active.
RetrieveException(zx.koid process_koid) -> (ProcessException process_exception) error zx.status;
/// Removes the process from limbo, releasing the exception. This will make
/// it "bubble up" beyond the scope of of this limbo, making it
/// unretrievable in the future from here.
ReleaseProcess(zx.koid process_koid) -> () error zx.status;
/// Adds filters to the limbo. Filters determine what processes the limbo
/// will store when receiving an exception. Repeated filters will be
/// ignored. Filters work by "filtering out" processes. It means that if a
/// filter matches, that process won't get included.
///
/// Filters work by substring matching. This means that a process name has
/// to have the filter as a substring in order to match it. Example:
///
/// Filter = "dev".
/// Process = "process" won't match.
/// Process = "devcoordinator" will match.
///
/// Adding filters is transactional: either all of them go in, or none at
/// all. The maximum amount of filters is determined by
/// |MAX_FILTERS_PER_CALL|. If the maximum is exceeded, ZX_ERR_NO_RESOURCES
/// is returned.
///
/// Changing filters have no effect on processes that are currently waiting
/// on an exception, but rather which future processes that will remain in
/// the limbo.
///
/// Returns ZX_ERR_UNAVAILABLE if limbo is not active.
AppendFilters(vector<string:MAX_FILTER_LENGTH>:MAX_FILTERS_PER_CALL filters) -> () error zx.status;
/// Removes filters to the limbo. Any filters that are not currently present
/// on the limbo will be ignored.
///
/// Returns ZX_ERR_UNAVAILABLE if limbo is not active.
RemoveFilters(vector<string:MAX_FILTER_LENGTH>:MAX_FILTERS_PER_CALL filters) -> () error zx.status;
/// Returns filters that are currently active within the limbo. If the limbo
/// is inactive, it will return an empty vector.
GetFilters() -> (vector<string:MAX_FILTER_LENGTH>:MAX_FILTERS_PER_CALL filters);
};
/// Intended to be read only metadada associated with an exception waiting in
/// limbo. The handles provided will only have read-only access to the resource,
/// so no modification can be done to them.
///
/// NOTE: Both |process| and |thread| will be valid if present.
table ProcessExceptionMetadata {
1: ExceptionInfo info;
/// Only has ZX_RIGHT_READ and ZX_RIGHT_GET_PROPERTY rights.
2: handle<process> process;
/// The thread that generated the exception.
/// The process may have other threads that are not reflected here.
/// Only has ZX_RIGHT_READ and ZX_RIGHT_GET_PROPERTY rights.
3: handle<thread> thread;
};