wrapper.rs 2.0 KB

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