Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/base/src/sys/macos/event.rs
5394 views
1
// Copyright 2024 The ChromiumOS Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
use std::time::Duration;
6
7
use crate::errno::Result;
8
use crate::event::EventWaitResult;
9
use crate::sys::macos::kqueue::make_kevent;
10
use crate::sys::macos::kqueue::Kqueue;
11
use crate::sys::unix::RawDescriptor;
12
use crate::SafeDescriptor;
13
14
#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
15
pub struct PlatformEvent {
16
queue: Kqueue,
17
}
18
19
impl PlatformEvent {
20
pub fn new() -> Result<PlatformEvent> {
21
let event = PlatformEvent {
22
queue: Kqueue::new()?,
23
};
24
let reg = make_kevent(
25
libc::EVFILT_USER,
26
libc::EV_ADD | libc::EV_CLEAR,
27
libc::NOTE_FFNOP,
28
);
29
event.queue.kevent(&[reg], &mut [], None)?;
30
Ok(event)
31
}
32
33
pub fn signal(&self) -> Result<()> {
34
let event = make_kevent(libc::EVFILT_USER, 0, libc::NOTE_TRIGGER);
35
self.queue.kevent(&[event], &mut [], None)?;
36
Ok(())
37
}
38
39
pub fn wait(&self) -> Result<()> {
40
let mut event = [make_kevent(0, 0, 0)];
41
self.queue.kevent(&[], &mut event[..], None)?;
42
Ok(())
43
}
44
45
pub fn wait_timeout(&self, timeout: Duration) -> Result<EventWaitResult> {
46
let mut event = [make_kevent(0, 0, 0)];
47
if self.queue.kevent(&[], &mut event[..], Some(timeout))?.len() == 0 {
48
Ok(EventWaitResult::TimedOut)
49
} else {
50
Ok(EventWaitResult::Signaled)
51
}
52
}
53
54
pub fn reset(&self) -> Result<()> {
55
self.wait_timeout(Duration::ZERO)?;
56
Ok(())
57
}
58
59
pub fn try_clone(&self) -> Result<PlatformEvent> {
60
self.queue.try_clone().map(|queue| PlatformEvent { queue })
61
}
62
}
63
64
impl crate::AsRawDescriptor for PlatformEvent {
65
fn as_raw_descriptor(&self) -> RawDescriptor {
66
self.queue.as_raw_descriptor()
67
}
68
}
69
70
impl crate::FromRawDescriptor for PlatformEvent {
71
unsafe fn from_raw_descriptor(descriptor: RawDescriptor) -> Self {
72
PlatformEvent {
73
queue: Kqueue::from_raw_descriptor(descriptor),
74
}
75
}
76
}
77
78
impl crate::IntoRawDescriptor for PlatformEvent {
79
fn into_raw_descriptor(self) -> RawDescriptor {
80
self.queue.into_raw_descriptor()
81
}
82
}
83
84
impl From<PlatformEvent> for SafeDescriptor {
85
fn from(evt: PlatformEvent) -> Self {
86
SafeDescriptor::from(evt.queue)
87
}
88
}
89
90
impl From<SafeDescriptor> for PlatformEvent {
91
fn from(queue: SafeDescriptor) -> Self {
92
PlatformEvent {
93
queue: Kqueue::from(queue),
94
}
95
}
96
}
97
98