virtio/devices/virtio_gpu/
deferred_call.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2025.
4
5use core::cell::Cell;
6
7/// Different deferred calls requested by and delivered to the
8/// [`VirtIOGPU`] driver.
9#[derive(Copy, Clone)]
10#[repr(usize)]
11pub enum PendingDeferredCall {
12    SetWriteFrame,
13}
14
15/// Manager of the deferred calls requested by and delivered to the
16/// [`VirtIOGPU`] driver.
17pub struct PendingDeferredCallMask(Cell<usize>);
18
19impl PendingDeferredCallMask {
20    pub fn new() -> Self {
21        PendingDeferredCallMask(Cell::new(0))
22    }
23
24    pub fn get_copy_and_clear(&self) -> PendingDeferredCallMask {
25        let old = PendingDeferredCallMask(self.0.clone());
26        self.0.set(0);
27        old
28    }
29
30    pub fn set(&self, call: PendingDeferredCall) {
31        self.0.set(self.0.get() | (1 << (call as usize)));
32    }
33
34    pub fn is_set(&self, call: PendingDeferredCall) -> bool {
35        (self.0.get() & (1 << (call as usize))) != 0
36    }
37
38    pub fn for_each_call(&self, mut f: impl FnMut(PendingDeferredCall)) {
39        let mut check_and_invoke = |call| {
40            if self.is_set(call) {
41                f(call)
42            }
43        };
44
45        check_and_invoke(PendingDeferredCall::SetWriteFrame);
46    }
47}