virtio/devices/virtio_gpu/
deferred_call.rs1use core::cell::Cell;
6
7#[derive(Copy, Clone)]
10#[repr(usize)]
11pub enum PendingDeferredCall {
12 SetWriteFrame,
13}
14
15pub 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}