1 // SPDX-License-Identifier: GPL-2.0 2 3 // Copyright (C) 2025 Google LLC. 4 5 use kernel::{list::ListArc, prelude::*, seq_file::SeqFile, seq_print, sync::UniqueArc}; 6 7 use crate::{node::Node, thread::Thread, BinderReturnWriter, DArc, DLArc, DTRWrap, DeliverToRead}; 8 9 use core::mem::MaybeUninit; 10 11 pub(crate) struct CritIncrWrapper { 12 inner: UniqueArc<MaybeUninit<DTRWrap<NodeWrapper>>>, 13 } 14 15 impl CritIncrWrapper { 16 pub(crate) fn new() -> Result<Self> { 17 Ok(CritIncrWrapper { 18 inner: UniqueArc::new_uninit(GFP_KERNEL)?, 19 }) 20 } 21 22 pub(super) fn init(self, node: DArc<Node>) -> DLArc<dyn DeliverToRead> { 23 match self.inner.pin_init_with(DTRWrap::new(NodeWrapper { node })) { 24 Ok(initialized) => ListArc::from(initialized) as _, 25 Err(err) => match err {}, 26 } 27 } 28 } 29 30 struct NodeWrapper { 31 node: DArc<Node>, 32 } 33 34 kernel::list::impl_list_arc_safe! { 35 impl ListArcSafe<0> for NodeWrapper { 36 untracked; 37 } 38 } 39 40 impl DeliverToRead for NodeWrapper { 41 fn do_work( 42 self: DArc<Self>, 43 _thread: &Thread, 44 writer: &mut BinderReturnWriter<'_>, 45 ) -> Result<bool> { 46 let node = &self.node; 47 let mut owner_inner = node.owner.inner.lock(); 48 let inner = node.inner.access_mut(&mut owner_inner); 49 50 let ds = &mut inner.delivery_state; 51 52 assert!(ds.has_pushed_wrapper); 53 assert!(ds.has_strong_zero2one); 54 ds.has_pushed_wrapper = false; 55 ds.has_strong_zero2one = false; 56 57 node.do_work_locked(writer, owner_inner) 58 } 59 60 fn cancel(self: DArc<Self>) {} 61 62 fn should_sync_wakeup(&self) -> bool { 63 false 64 } 65 66 #[inline(never)] 67 fn debug_print(&self, m: &SeqFile, prefix: &str, _tprefix: &str) -> Result<()> { 68 seq_print!( 69 m, 70 "{}node work {}: u{:016x} c{:016x}\n", 71 prefix, 72 self.node.debug_id, 73 self.node.ptr, 74 self.node.cookie, 75 ); 76 Ok(()) 77 } 78 } 79