blob: aff23c7aae10085dee14012c11f4963a097359d8 [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.
library fuchsia.netemul.sync;
using zx;
/// Simple data structure passed on netemul bus.
type Event = table {
/// User-defined event code.
1: code int32;
/// string:MAX message.
2: message string:MAX;
/// serialized arguments.
3: arguments vector<uint8>:MAX;
};
/// Represents a named bus:
/// a bus is a broadcast pub/sub network that distributes Events.
/// Events are not stored, only forwarded to attached clients.
closed protocol Bus {
/// Publishes event on the bus.
strict Publish(struct {
data Event;
});
/// Publishes data on bus and only returns when data has been dispatched.
/// Use this if you need guarantees that the data was broadcast before continuing.
/// Note that this ensures that the data will be *published* to all listening clients,
/// but it cannot guarantee that all clients will have observed the event before it returns.
strict EnsurePublish(struct {
data Event;
}) -> ();
/// Notifies client of new event.
strict -> OnBusData(struct {
data Event;
});
/// Get list of named clients.
strict GetClients() -> (struct {
clients vector<string:MAX>:MAX;
});
/// Notifies a client is now attached.
/// Upon subscribing to a bus, a client will always receive an `OnClientAttached` event for each
/// client present on the bus at the moment it joined.
strict -> OnClientAttached(struct {
client string:MAX;
});
/// Notifies a client was detached.
strict -> OnClientDetached(struct {
client string:MAX;
});
/// Waits for up to `timeout` (nsec) for all the clients in `clients`.
/// Returns true if all clients are present on the bus before timeout expired.
/// If `result` is false, `absent` will contain the entries in `clients` that still weren't
/// present on the bus when the timout expired.
/// Use `timeout` <= 0 for indefinite wait.
strict WaitForClients(struct {
clients vector<string:MAX>:MAX;
timeout zx.Duration;
}) -> (struct {
result bool;
absent vector<string:MAX>:<MAX, optional>;
});
/// Waits for up to `timeout` (nsec) for an event that matches `data`.
/// Event equality is performed by comparing *all* set fields in `data`.
/// Returns true if event was received before timeout expired.
/// Use `timeout` <= 0 for indefinite wait.
strict WaitForEvent(struct {
data Event;
timeout zx.Duration;
}) -> (struct {
result bool;
});
};
/// The SyncManager is the entry point to attach a client to a bus or use other synchronization
/// primitives.
/// The client's 'ticket' to remain on the bus is the channel obtained through the 'BusSubscribe' call.
@discoverable
closed protocol SyncManager {
/// Subscribes to bus 'busName' with a given client name.
/// Duplicate client names are disallowed and will cause the request to return unfulfilled.
strict BusSubscribe(resource struct {
bus_name string:MAX;
client_name string:MAX;
bus server_end:Bus;
});
/// Waits on a named counter barrier with name `barrierName`.
/// Functon will return true if the number of waits pending on the barrier matches or exceeds
/// `threshold` before `timeout` (nsec) expires.
/// Use `timeout` <= 0 for indefinite wait.
strict WaitForBarrierThreshold(struct {
barrier_name string:MAX;
threshold uint32;
timeout zx.Duration;
}) -> (struct {
result bool;
});
};