// 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 zx;

@transport("Syscall")
protocol HandleOwnership {
    fun0(resource struct {
        in vector<handle>;
    }) -> (resource struct {
        out vector<handle>;
    });
    fun1(resource struct {
        @release
        in vector<handle>;
    });
    fun2(resource struct {
        @use
        in vector<handle>;
    }) -> (resource struct {
        @use
        out vector<handle>;
    });
    fun3(resource struct {
        in vector<handle>;
    }) -> (resource struct {
        @acquire
        out vector<handle>;
    });
    fun4(resource struct {
        in handle;
    }) -> (resource struct {
        status status;
        out handle;
    });
    fun5(resource struct {
        @release
        in handle;
    }) -> (resource struct {
        status status;
        @use
        out handle;
    });
    @handle_unchecked
    fun6(resource struct {
        in vector<handle>;
    }) -> (resource struct {
        out vector<handle>;
    });
};
