1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Copyright 2017 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.

//! Type-safe bindings for Zircon event objects.

use crate::ok;
use crate::{AsHandleRef, Handle, HandleBased, HandleRef};
use fuchsia_zircon_sys as sys;

/// An object representing a Zircon
/// [event object](https://fuchsia.dev/fuchsia-src/concepts/objects/event.md).
///
/// As essentially a subtype of `Handle`, it can be freely interconverted.
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[repr(transparent)]
pub struct Event(Handle);
impl_handle_based!(Event);

impl Event {
    /// Create an event object, an object which is signalable but nothing else. Wraps the
    /// [zx_event_create](https://fuchsia.dev/fuchsia-src/reference/syscalls/event_create.md)
    /// syscall.
    ///
    /// # Panics
    ///
    /// If the kernel reports no memory available or the process' job policy denies event creation.
    pub fn create() -> Self {
        let mut out = 0;
        let opts = 0;
        let status = unsafe { sys::zx_event_create(opts, &mut out) };
        ok(status)
            .expect("event creation always succeeds except with OOM or when job policy denies it");
        unsafe { Self::from(Handle::from_raw(out)) }
    }
}