diff --git a/crates/ironrdp-session/src/active_stage.rs b/crates/ironrdp-session/src/active_stage.rs index a010afa3..50a7fd04 100644 --- a/crates/ironrdp-session/src/active_stage.rs +++ b/crates/ironrdp-session/src/active_stage.rs @@ -1,4 +1,4 @@ -use std::rc::Rc; +use std::sync::Arc; use ironrdp_connector::connection_activation::ConnectionActivationSequence; use ironrdp_connector::ConnectionResult; @@ -254,7 +254,7 @@ pub enum ActiveStageOutput { PointerDefault, PointerHidden, PointerPosition { x: u16, y: u16 }, - PointerBitmap(Rc), + PointerBitmap(Arc), Terminate(GracefulDisconnectReason), DeactivateAll(Box), } diff --git a/crates/ironrdp-session/src/fast_path.rs b/crates/ironrdp-session/src/fast_path.rs index e22fc1d6..d6262c6d 100644 --- a/crates/ironrdp-session/src/fast_path.rs +++ b/crates/ironrdp-session/src/fast_path.rs @@ -1,4 +1,4 @@ -use std::rc::Rc; +use std::sync::Arc; use ironrdp_core::{decode_cursor, DecodeErrorKind, ReadCursor, WriteBuf}; use ironrdp_graphics::image_processing::PixelFormat; @@ -24,7 +24,7 @@ pub enum UpdateKind { PointerDefault, PointerHidden, PointerPosition { x: u16, y: u16 }, - PointerBitmap(Rc), + PointerBitmap(Arc), } pub struct Processor { @@ -216,17 +216,17 @@ impl Processor { PointerUpdateData::Color(pointer) => { let cache_index = pointer.cache_index; - let decoded_pointer = Rc::new( + let decoded_pointer = Arc::new( DecodedPointer::decode_color_pointer_attribute(&pointer, bitmap_target) .expect("Failed to decode color pointer attribute"), ); let _ = self .pointer_cache - .insert(usize::from(cache_index), Rc::clone(&decoded_pointer)); + .insert(usize::from(cache_index), Arc::clone(&decoded_pointer)); if !self.pointer_software_rendering { - processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&decoded_pointer))); + processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&decoded_pointer))); } else if let Some(rect) = image.update_pointer(decoded_pointer)? { processor_updates.push(UpdateKind::Region(rect)); } @@ -240,7 +240,7 @@ impl Processor { self.use_system_pointer = false; // Send graphics update if !self.pointer_software_rendering { - processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&cached_pointer))); + processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&cached_pointer))); } else if let Some(rect) = image.update_pointer(cached_pointer)? { processor_updates.push(UpdateKind::Region(rect)); } else { @@ -256,17 +256,17 @@ impl Processor { PointerUpdateData::New(pointer) => { let cache_index = pointer.color_pointer.cache_index; - let decoded_pointer = Rc::new( + let decoded_pointer = Arc::new( DecodedPointer::decode_pointer_attribute(&pointer, bitmap_target) .expect("Failed to decode pointer attribute"), ); let _ = self .pointer_cache - .insert(usize::from(cache_index), Rc::clone(&decoded_pointer)); + .insert(usize::from(cache_index), Arc::clone(&decoded_pointer)); if !self.pointer_software_rendering { - processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&decoded_pointer))); + processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&decoded_pointer))); } else if let Some(rect) = image.update_pointer(decoded_pointer)? { processor_updates.push(UpdateKind::Region(rect)); } @@ -274,17 +274,17 @@ impl Processor { PointerUpdateData::Large(pointer) => { let cache_index = pointer.cache_index; - let decoded_pointer: Rc = Rc::new( + let decoded_pointer: Arc = Arc::new( DecodedPointer::decode_large_pointer_attribute(&pointer, bitmap_target) .expect("Failed to decode large pointer attribute"), ); let _ = self .pointer_cache - .insert(usize::from(cache_index), Rc::clone(&decoded_pointer)); + .insert(usize::from(cache_index), Arc::clone(&decoded_pointer)); if !self.pointer_software_rendering { - processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&decoded_pointer))); + processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&decoded_pointer))); } else if let Some(rect) = image.update_pointer(decoded_pointer)? { processor_updates.push(UpdateKind::Region(rect)); } diff --git a/crates/ironrdp-session/src/image.rs b/crates/ironrdp-session/src/image.rs index a552c263..b2ae0244 100644 --- a/crates/ironrdp-session/src/image.rs +++ b/crates/ironrdp-session/src/image.rs @@ -1,5 +1,6 @@ -use std::rc::Rc; +use std::sync::Arc; +use ironrdp_core::assert_impl; use ironrdp_graphics::color_conversion::rdp_16bit_to_rgb; use ironrdp_graphics::image_processing::{ImageRegion, ImageRegionMut, PixelFormat}; use ironrdp_graphics::pointer::DecodedPointer; @@ -24,7 +25,7 @@ pub struct DecodedImage { pointer_x: u16, pointer_y: u16, - pointer: Option>, + pointer: Option>, /// Image data, overridden by pointer. Used to restore image after pointer was hidden or moved pointer_backbuffer: Vec, /// Whether to show pointer or not @@ -36,6 +37,8 @@ pub struct DecodedImage { height: u16, } +assert_impl!(DecodedImage: Send); + impl core::fmt::Debug for DecodedImage { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_struct("DecodedImage") @@ -384,7 +387,7 @@ impl DecodedImage { } } - pub(crate) fn update_pointer(&mut self, pointer: Rc) -> SessionResult> { + pub(crate) fn update_pointer(&mut self, pointer: Arc) -> SessionResult> { self.show_pointer = true; // Remove old pointer from frame buffer diff --git a/crates/ironrdp-session/src/pointer.rs b/crates/ironrdp-session/src/pointer.rs index 8266aafc..192ae2fa 100644 --- a/crates/ironrdp-session/src/pointer.rs +++ b/crates/ironrdp-session/src/pointer.rs @@ -1,20 +1,20 @@ use std::collections::HashMap; -use std::rc::Rc; +use std::sync::Arc; use ironrdp_graphics::pointer::DecodedPointer; #[derive(Debug, Clone, Default)] pub struct PointerCache { // TODO(@pacancoder) maybe use Vec> instead? - cache: HashMap>, + cache: HashMap>, } impl PointerCache { - pub fn insert(&mut self, id: usize, pointer: Rc) -> Option> { + pub fn insert(&mut self, id: usize, pointer: Arc) -> Option> { self.cache.insert(id, pointer) } - pub fn get(&self, id: usize) -> Option> { + pub fn get(&self, id: usize) -> Option> { self.cache.get(&id).cloned() } diff --git a/ffi/src/graphics.rs b/ffi/src/graphics.rs index 24a7f59a..548cd012 100644 --- a/ffi/src/graphics.rs +++ b/ffi/src/graphics.rs @@ -1,11 +1,11 @@ #[diplomat::bridge] pub mod ffi { - use std::rc::Rc; + use std::sync::Arc; use crate::utils::ffi::BytesSlice; #[diplomat::opaque] - pub struct DecodedPointer(pub Rc); + pub struct DecodedPointer(pub Arc); impl DecodedPointer { pub fn get_width(&self) -> u16 { diff --git a/ffi/src/session/mod.rs b/ffi/src/session/mod.rs index 3505fcc7..2e5404db 100644 --- a/ffi/src/session/mod.rs +++ b/ffi/src/session/mod.rs @@ -225,7 +225,7 @@ pub mod ffi { pub fn get_pointer_bitmap(&self) -> Result, Box> { match &self.0 { ironrdp::session::ActiveStageOutput::PointerBitmap(decoded_pointer) => { - Ok(DecodedPointer(std::rc::Rc::clone(decoded_pointer))) + Ok(DecodedPointer(std::sync::Arc::clone(decoded_pointer))) } _ => Err(IncorrectEnumTypeError::on_variant("PointerBitmap") .of_enum("ActiveStageOutput")