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