// Copyright 2016 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.tracing.controller;

// The controller interface used by the trace tool to start/stop tracing.
[Discoverable]
protocol Controller {
    // Requests to start tracing with the specified |options|.
    //
    // The trace controller acknowledges the request when all
    // registered providers have been started or after |options.start_timeout_milliseconds| milliseconds.
    //
    // The trace controller emits trace data to |output| as a sequence of
    // binary formatted trace records.  Traces obtained from different providers
    // are delimited by metadata records within the stream.
    //
    // The trace controller is responsible for lightly validating the structure of
    // trace records as it copies them from trace buffers into the output.
    // In particular, it must verify the size of each record header to ensure
    // that the framing of trace records in the data stream is maintained.
    //
    // The trace controller does not validate the contents of the trace records
    // themselves.  For example, it should not try to check argument lengths in
    // events.  This ensures that the trace format can be extended without needing
    // to modify the trace controller.
    StartTracing(TraceOptions options, handle<socket> output) -> ();

    // Requests to stop tracing.
    //
    // The trace controller continues to transfer any remaining data to the
    // output until finished, then closes the output.
    StopTracing();

    // Gets the known categories.
    GetKnownCategories() -> (vector<KnownCategory> categories);
};

struct KnownCategory {
    string:100 name;
    string description;
};

// This is a copy of tracelink.fidl:BufferingMode.
enum BufferingMode : uint8 {
    ONESHOT = 0;
    CIRCULAR = 1;
    STREAMING = 2;
};

// Individual providers can be tuned with this.
table ProviderSpec {
    1: string:100 name;
    2: uint32 buffer_size_megabytes_hint;
};

// Provides options for the trace.
table TraceOptions {
    // The trace categories to record, or an empty array for all.
    1: vector<string:100>:100 categories;

    // Suggested size of trace buffer which each provider should receive.
    2: uint32 buffer_size_megabytes_hint = 4;

    // Acknowledge start request after at most |start_timeout_milliseconds|.
    3: uint64 start_timeout_milliseconds = 5000;

    4: BufferingMode buffering_mode = ONESHOT;

    // Overrides for particular providers.
    5: vector<ProviderSpec>:100 provider_specs;
};
