// 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.debugdata;

using zx;

/// The maximum length, in bytes, of data sink or configuration name.
/// TODO(mcgrathr): Align this with file name limits in some fs protocol.
const uint64 MAX_NAME = 1024;

/// DebugData defines the interface for instrumentation configuration and data
/// publishing.
[ForDeprecatedCBindings, Discoverable]
protocol DebugData {
    /// The program runtime sends a string naming a `data_sink` and transfers
    /// the sole handle to a VMO containing the `data` it wants published
    /// there.  The `data_sink` string identifies a type of data, and the
    /// VMO's object name can specifically identify the data set in this VMO.
    /// The ZX_PROP_VMO_CONTENT_SIZE property should be set on the VMO to
    /// indicate the precise size of the data in case that is not whole pages;
    /// however, leaving it unset (i.e. 0) is acceptable when the whole-page
    /// size of the VMO is the intended size of dump.  The client must
    /// transfer the only handle to the VMO (which prevents the VMO being
    /// resized without the receiver's knowledge), but it might still have the
    /// VMO mapped in and continue to write data to it.  Code instrumentation
    /// runtimes use this to deliver large binary trace results.
    // TODO(mcgrathr): Consider dropping the "sole handle" wording and instead
    // just say the receiver is expected to wait for the process to die before
    // consuming the VMO.
    Publish(string:MAX_NAME data_sink, zx.handle:VMO data);

    /// The program runtime names a `config_name` referring to a debug
    /// configuration of some kind and gets back a VMO to read configuration
    /// data from.  The sanitizer runtimes use this to allow large options
    /// text to be stored in a file rather than passed directly in environment
    /// strings.
    LoadConfig(string:MAX_NAME config_name) -> (zx.handle:VMO? config);
};
