Skip to content

Commit 45f6611

Browse files
elmarcoCBenoit
authored andcommitted
feat(session)!: make DecodedImage Send
This will allow to share it between different threads. Signed-off-by: Marc-André Lureau <[email protected]>
1 parent 7507a15 commit 45f6611

File tree

6 files changed

+27
-24
lines changed

6 files changed

+27
-24
lines changed

crates/ironrdp-session/src/active_stage.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::rc::Rc;
1+
use std::sync::Arc;
22

33
use ironrdp_connector::connection_activation::ConnectionActivationSequence;
44
use ironrdp_connector::ConnectionResult;
@@ -254,7 +254,7 @@ pub enum ActiveStageOutput {
254254
PointerDefault,
255255
PointerHidden,
256256
PointerPosition { x: u16, y: u16 },
257-
PointerBitmap(Rc<DecodedPointer>),
257+
PointerBitmap(Arc<DecodedPointer>),
258258
Terminate(GracefulDisconnectReason),
259259
DeactivateAll(Box<ConnectionActivationSequence>),
260260
}

crates/ironrdp-session/src/fast_path.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::rc::Rc;
1+
use std::sync::Arc;
22

33
use ironrdp_core::{decode_cursor, DecodeErrorKind, ReadCursor, WriteBuf};
44
use ironrdp_graphics::image_processing::PixelFormat;
@@ -24,7 +24,7 @@ pub enum UpdateKind {
2424
PointerDefault,
2525
PointerHidden,
2626
PointerPosition { x: u16, y: u16 },
27-
PointerBitmap(Rc<DecodedPointer>),
27+
PointerBitmap(Arc<DecodedPointer>),
2828
}
2929

3030
pub struct Processor {
@@ -216,17 +216,17 @@ impl Processor {
216216
PointerUpdateData::Color(pointer) => {
217217
let cache_index = pointer.cache_index;
218218

219-
let decoded_pointer = Rc::new(
219+
let decoded_pointer = Arc::new(
220220
DecodedPointer::decode_color_pointer_attribute(&pointer, bitmap_target)
221221
.expect("Failed to decode color pointer attribute"),
222222
);
223223

224224
let _ = self
225225
.pointer_cache
226-
.insert(usize::from(cache_index), Rc::clone(&decoded_pointer));
226+
.insert(usize::from(cache_index), Arc::clone(&decoded_pointer));
227227

228228
if !self.pointer_software_rendering {
229-
processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&decoded_pointer)));
229+
processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&decoded_pointer)));
230230
} else if let Some(rect) = image.update_pointer(decoded_pointer)? {
231231
processor_updates.push(UpdateKind::Region(rect));
232232
}
@@ -240,7 +240,7 @@ impl Processor {
240240
self.use_system_pointer = false;
241241
// Send graphics update
242242
if !self.pointer_software_rendering {
243-
processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&cached_pointer)));
243+
processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&cached_pointer)));
244244
} else if let Some(rect) = image.update_pointer(cached_pointer)? {
245245
processor_updates.push(UpdateKind::Region(rect));
246246
} else {
@@ -256,35 +256,35 @@ impl Processor {
256256
PointerUpdateData::New(pointer) => {
257257
let cache_index = pointer.color_pointer.cache_index;
258258

259-
let decoded_pointer = Rc::new(
259+
let decoded_pointer = Arc::new(
260260
DecodedPointer::decode_pointer_attribute(&pointer, bitmap_target)
261261
.expect("Failed to decode pointer attribute"),
262262
);
263263

264264
let _ = self
265265
.pointer_cache
266-
.insert(usize::from(cache_index), Rc::clone(&decoded_pointer));
266+
.insert(usize::from(cache_index), Arc::clone(&decoded_pointer));
267267

268268
if !self.pointer_software_rendering {
269-
processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&decoded_pointer)));
269+
processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&decoded_pointer)));
270270
} else if let Some(rect) = image.update_pointer(decoded_pointer)? {
271271
processor_updates.push(UpdateKind::Region(rect));
272272
}
273273
}
274274
PointerUpdateData::Large(pointer) => {
275275
let cache_index = pointer.cache_index;
276276

277-
let decoded_pointer: Rc<DecodedPointer> = Rc::new(
277+
let decoded_pointer: Arc<DecodedPointer> = Arc::new(
278278
DecodedPointer::decode_large_pointer_attribute(&pointer, bitmap_target)
279279
.expect("Failed to decode large pointer attribute"),
280280
);
281281

282282
let _ = self
283283
.pointer_cache
284-
.insert(usize::from(cache_index), Rc::clone(&decoded_pointer));
284+
.insert(usize::from(cache_index), Arc::clone(&decoded_pointer));
285285

286286
if !self.pointer_software_rendering {
287-
processor_updates.push(UpdateKind::PointerBitmap(Rc::clone(&decoded_pointer)));
287+
processor_updates.push(UpdateKind::PointerBitmap(Arc::clone(&decoded_pointer)));
288288
} else if let Some(rect) = image.update_pointer(decoded_pointer)? {
289289
processor_updates.push(UpdateKind::Region(rect));
290290
}

crates/ironrdp-session/src/image.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use std::rc::Rc;
1+
use std::sync::Arc;
22

3+
use ironrdp_core::assert_impl;
34
use ironrdp_graphics::color_conversion::rdp_16bit_to_rgb;
45
use ironrdp_graphics::image_processing::{ImageRegion, ImageRegionMut, PixelFormat};
56
use ironrdp_graphics::pointer::DecodedPointer;
@@ -24,7 +25,7 @@ pub struct DecodedImage {
2425
pointer_x: u16,
2526
pointer_y: u16,
2627

27-
pointer: Option<Rc<DecodedPointer>>,
28+
pointer: Option<Arc<DecodedPointer>>,
2829
/// Image data, overridden by pointer. Used to restore image after pointer was hidden or moved
2930
pointer_backbuffer: Vec<u8>,
3031
/// Whether to show pointer or not
@@ -36,6 +37,8 @@ pub struct DecodedImage {
3637
height: u16,
3738
}
3839

40+
assert_impl!(DecodedImage: Send);
41+
3942
impl core::fmt::Debug for DecodedImage {
4043
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
4144
f.debug_struct("DecodedImage")
@@ -384,7 +387,7 @@ impl DecodedImage {
384387
}
385388
}
386389

387-
pub(crate) fn update_pointer(&mut self, pointer: Rc<DecodedPointer>) -> SessionResult<Option<InclusiveRectangle>> {
390+
pub(crate) fn update_pointer(&mut self, pointer: Arc<DecodedPointer>) -> SessionResult<Option<InclusiveRectangle>> {
388391
self.show_pointer = true;
389392

390393
// Remove old pointer from frame buffer

crates/ironrdp-session/src/pointer.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
use std::collections::HashMap;
2-
use std::rc::Rc;
2+
use std::sync::Arc;
33

44
use ironrdp_graphics::pointer::DecodedPointer;
55

66
#[derive(Debug, Clone, Default)]
77
pub struct PointerCache {
88
// TODO(@pacancoder) maybe use Vec<Optional<...>> instead?
9-
cache: HashMap<usize, Rc<DecodedPointer>>,
9+
cache: HashMap<usize, Arc<DecodedPointer>>,
1010
}
1111

1212
impl PointerCache {
13-
pub fn insert(&mut self, id: usize, pointer: Rc<DecodedPointer>) -> Option<Rc<DecodedPointer>> {
13+
pub fn insert(&mut self, id: usize, pointer: Arc<DecodedPointer>) -> Option<Arc<DecodedPointer>> {
1414
self.cache.insert(id, pointer)
1515
}
1616

17-
pub fn get(&self, id: usize) -> Option<Rc<DecodedPointer>> {
17+
pub fn get(&self, id: usize) -> Option<Arc<DecodedPointer>> {
1818
self.cache.get(&id).cloned()
1919
}
2020

ffi/src/graphics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#[diplomat::bridge]
22
pub mod ffi {
3-
use std::rc::Rc;
3+
use std::sync::Arc;
44

55
use crate::utils::ffi::BytesSlice;
66

77
#[diplomat::opaque]
8-
pub struct DecodedPointer(pub Rc<ironrdp::graphics::pointer::DecodedPointer>);
8+
pub struct DecodedPointer(pub Arc<ironrdp::graphics::pointer::DecodedPointer>);
99

1010
impl DecodedPointer {
1111
pub fn get_width(&self) -> u16 {

ffi/src/session/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ pub mod ffi {
225225
pub fn get_pointer_bitmap(&self) -> Result<Box<DecodedPointer>, Box<IronRdpError>> {
226226
match &self.0 {
227227
ironrdp::session::ActiveStageOutput::PointerBitmap(decoded_pointer) => {
228-
Ok(DecodedPointer(std::rc::Rc::clone(decoded_pointer)))
228+
Ok(DecodedPointer(std::sync::Arc::clone(decoded_pointer)))
229229
}
230230
_ => Err(IncorrectEnumTypeError::on_variant("PointerBitmap")
231231
.of_enum("ActiveStageOutput")

0 commit comments

Comments
 (0)