pci_core/test_helpers/
mod.rs1use crate::msi::MsiControl;
7use crate::msi::MsiInterruptTarget;
8use parking_lot::Mutex;
9use std::collections::VecDeque;
10use std::sync::Arc;
11
12#[derive(Debug, Clone)]
15pub struct TestPciInterruptController {
16 inner: Arc<TestPciInterruptControllerInner>,
17}
18
19#[derive(Debug)]
20struct TestPciInterruptControllerInner {
21 msi_requests: Mutex<VecDeque<(u64, u32)>>, }
24
25impl TestPciInterruptController {
26 pub fn new() -> Self {
28 Self {
29 inner: Arc::new(TestPciInterruptControllerInner {
30 msi_requests: Mutex::new(VecDeque::new()),
31 }),
32 }
33 }
34
35 pub fn get_next_interrupt(&self) -> Option<(u64, u32)> {
37 self.inner.msi_requests.lock().pop_front()
38 }
39}
40
41impl MsiInterruptTarget for TestPciInterruptController {
42 fn new_interrupt(&self) -> Box<dyn MsiControl> {
43 let controller = self.inner.clone();
44 Box::new(move |address, data| controller.msi_requests.lock().push_back((address, data)))
45 }
46}