xref: /aosp_15_r20/external/crosvm/base/src/sys/macos/event.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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 {
new() -> Result<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 
signal(&self) -> Result<()>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 
wait(&self) -> Result<()>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 
wait_timeout(&self, timeout: Duration) -> Result<EventWaitResult>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 
reset(&self) -> Result<()>54     pub fn reset(&self) -> Result<()> {
55         self.wait_timeout(Duration::ZERO)?;
56         Ok(())
57     }
58 
try_clone(&self) -> Result<PlatformEvent>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 {
as_raw_descriptor(&self) -> RawDescriptor65     fn as_raw_descriptor(&self) -> RawDescriptor {
66         self.queue.as_raw_descriptor()
67     }
68 }
69 
70 impl crate::FromRawDescriptor for PlatformEvent {
from_raw_descriptor(descriptor: RawDescriptor) -> Self71     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 {
into_raw_descriptor(self) -> RawDescriptor79     fn into_raw_descriptor(self) -> RawDescriptor {
80         self.queue.into_raw_descriptor()
81     }
82 }
83 
84 impl From<PlatformEvent> for SafeDescriptor {
from(evt: PlatformEvent) -> Self85     fn from(evt: PlatformEvent) -> Self {
86         SafeDescriptor::from(evt.queue)
87     }
88 }
89 
90 impl From<SafeDescriptor> for PlatformEvent {
from(queue: SafeDescriptor) -> Self91     fn from(queue: SafeDescriptor) -> Self {
92         PlatformEvent {
93             queue: Kqueue::from(queue),
94         }
95     }
96 }
97