You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.5 KiB
82 lines
2.5 KiB
// Copyright 2020 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
use sys_util::EventFd;
|
|
|
|
use crate::{AsyncResult, Executor, IntoAsync, IoSourceExt};
|
|
|
|
/// An async version of `sys_util::EventFd`.
|
|
pub struct EventAsync {
|
|
io_source: Box<dyn IoSourceExt<EventFd>>,
|
|
}
|
|
|
|
impl EventAsync {
|
|
pub fn new(event: EventFd, ex: &Executor) -> AsyncResult<EventAsync> {
|
|
ex.async_from(event)
|
|
.map(|io_source| EventAsync { io_source })
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub(crate) fn new_poll(event: EventFd, ex: &crate::FdExecutor) -> AsyncResult<EventAsync> {
|
|
crate::executor::async_poll_from(event, ex).map(|io_source| EventAsync { io_source })
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub(crate) fn new_uring(event: EventFd, ex: &crate::URingExecutor) -> AsyncResult<EventAsync> {
|
|
crate::executor::async_uring_from(event, ex).map(|io_source| EventAsync { io_source })
|
|
}
|
|
|
|
/// Gets the next value from the eventfd.
|
|
#[allow(dead_code)]
|
|
pub async fn next_val(&self) -> AsyncResult<u64> {
|
|
self.io_source.read_u64().await
|
|
}
|
|
}
|
|
|
|
impl IntoAsync for EventFd {}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
use crate::{Executor, FdExecutor, URingExecutor};
|
|
|
|
#[test]
|
|
fn next_val_reads_value() {
|
|
async fn go(event: EventFd, ex: &Executor) -> u64 {
|
|
let event_async = EventAsync::new(event, ex).unwrap();
|
|
event_async.next_val().await.unwrap()
|
|
}
|
|
|
|
let eventfd = EventFd::new().unwrap();
|
|
eventfd.write(0xaa).unwrap();
|
|
let ex = Executor::new().unwrap();
|
|
let val = ex.run_until(go(eventfd, &ex)).unwrap();
|
|
assert_eq!(val, 0xaa);
|
|
}
|
|
|
|
#[test]
|
|
fn next_val_reads_value_poll_and_ring() {
|
|
async fn go(event_async: EventAsync) -> u64 {
|
|
event_async.next_val().await.unwrap()
|
|
}
|
|
|
|
let eventfd = EventFd::new().unwrap();
|
|
eventfd.write(0xaa).unwrap();
|
|
let uring_ex = URingExecutor::new().unwrap();
|
|
let val = uring_ex
|
|
.run_until(go(EventAsync::new_uring(eventfd, &uring_ex).unwrap()))
|
|
.unwrap();
|
|
assert_eq!(val, 0xaa);
|
|
|
|
let eventfd = EventFd::new().unwrap();
|
|
eventfd.write(0xaa).unwrap();
|
|
let poll_ex = FdExecutor::new().unwrap();
|
|
let val = poll_ex
|
|
.run_until(go(EventAsync::new_poll(eventfd, &poll_ex).unwrap()))
|
|
.unwrap();
|
|
assert_eq!(val, 0xaa);
|
|
}
|
|
}
|