screencopy: Make threadsafe

This commit is contained in:
Victoria Brekenfeld 2024-06-07 19:04:00 +02:00 committed by Victoria Brekenfeld
parent e78e199663
commit aae16c49dc
3 changed files with 22 additions and 19 deletions

View file

@ -1,4 +1,4 @@
use std::{borrow::Borrow, cell::RefCell, collections::HashMap}; use std::{borrow::Borrow, collections::HashMap, sync::Mutex};
use smithay::{ use smithay::{
backend::{ backend::{
@ -92,8 +92,8 @@ impl ScreencopyHandler for State {
return; return;
}; };
session.user_data().insert_if_missing(|| { session.user_data().insert_if_missing_threadsafe(|| {
RefCell::new(SessionUserData::new(OutputDamageTracker::from_output( Mutex::new(SessionUserData::new(OutputDamageTracker::from_output(
&output, &output,
))) )))
}); });
@ -107,8 +107,8 @@ impl ScreencopyHandler for State {
return; return;
}; };
session.user_data().insert_if_missing(|| { session.user_data().insert_if_missing_threadsafe(|| {
RefCell::new(SessionUserData::new(OutputDamageTracker::from_output( Mutex::new(SessionUserData::new(OutputDamageTracker::from_output(
workspace.output(), workspace.output(),
))) )))
}); });
@ -116,8 +116,8 @@ impl ScreencopyHandler for State {
} }
ImageSourceData::Toplevel(mut toplevel) => { ImageSourceData::Toplevel(mut toplevel) => {
let size = toplevel.geometry().size.to_physical(1); let size = toplevel.geometry().size.to_physical(1);
session.user_data().insert_if_missing(|| { session.user_data().insert_if_missing_threadsafe(|| {
RefCell::new(SessionUserData::new(OutputDamageTracker::new( Mutex::new(SessionUserData::new(OutputDamageTracker::new(
size, size,
1.0, 1.0,
Transform::Normal, Transform::Normal,
@ -153,8 +153,8 @@ impl ScreencopyHandler for State {
(pointer_loc, pointer_size, hotspot) (pointer_loc, pointer_size, hotspot)
}; };
session.user_data().insert_if_missing(|| { session.user_data().insert_if_missing_threadsafe(|| {
RefCell::new(SessionUserData::new(OutputDamageTracker::new( Mutex::new(SessionUserData::new(OutputDamageTracker::new(
pointer_size.to_logical(1, Transform::Normal).to_physical(1), pointer_size.to_logical(1, Transform::Normal).to_physical(1),
1.0, 1.0,
Transform::Normal, Transform::Normal,

View file

@ -152,7 +152,7 @@ where
#[cfg(feature = "debug")] #[cfg(feature = "debug")]
puffin::profile_function!(); puffin::profile_function!();
let mut session_damage_tracking = session.borrow_mut(); let mut session_damage_tracking = session.lock().unwrap();
let buffer = frame.buffer(); let buffer = frame.buffer();
let age = session_damage_tracking.age_for_buffer(&buffer); let age = session_damage_tracking.age_for_buffer(&buffer);
@ -212,7 +212,7 @@ pub fn render_workspace_to_buffer(
}; };
session.update_constraints(constraints); session.update_constraints(constraints);
if let Some(data) = session.user_data().get::<SessionData>() { if let Some(data) = session.user_data().get::<SessionData>() {
*data.borrow_mut() = SessionUserData::new(OutputDamageTracker::from_output(&output)); *data.lock().unwrap() = SessionUserData::new(OutputDamageTracker::from_output(&output));
} }
frame.fail(FailureReason::BufferConstraints); frame.fail(FailureReason::BufferConstraints);
return; return;
@ -478,7 +478,7 @@ pub fn render_window_to_buffer(
session.update_constraints(constraints); session.update_constraints(constraints);
if let Some(data) = session.user_data().get::<SessionData>() { if let Some(data) = session.user_data().get::<SessionData>() {
let size = geometry.size.to_physical(1); let size = geometry.size.to_physical(1);
*data.borrow_mut() = *data.lock().unwrap() =
SessionUserData::new(OutputDamageTracker::new(size, 1.0, Transform::Normal)); SessionUserData::new(OutputDamageTracker::new(size, 1.0, Transform::Normal));
} }
frame.fail(FailureReason::BufferConstraints); frame.fail(FailureReason::BufferConstraints);
@ -736,7 +736,7 @@ pub fn render_cursor_to_buffer(
}; };
session.update_constraints(constraints); session.update_constraints(constraints);
if let Some(data) = session.user_data().get::<SessionData>() { if let Some(data) = session.user_data().get::<SessionData>() {
*data.borrow_mut() = SessionUserData::new(OutputDamageTracker::new( *data.lock().unwrap() = SessionUserData::new(OutputDamageTracker::new(
cursor_size.to_logical(1, Transform::Normal).to_physical(1), cursor_size.to_logical(1, Transform::Normal).to_physical(1),
1.0, 1.0,
Transform::Normal, Transform::Normal,

View file

@ -2,6 +2,7 @@ use std::{
cell::RefCell, cell::RefCell,
collections::HashMap, collections::HashMap,
ops::{Deref, DerefMut}, ops::{Deref, DerefMut},
sync::Mutex,
}; };
use smithay::{ use smithay::{
@ -16,9 +17,9 @@ use crate::{
}; };
type ScreencopySessionsData = RefCell<ScreencopySessions>; type ScreencopySessionsData = RefCell<ScreencopySessions>;
type PendingScreencopyBuffers = RefCell<Vec<(Session, DropableFrame)>>; type PendingScreencopyBuffers = Mutex<Vec<(Session, DropableFrame)>>;
pub type SessionData = RefCell<SessionUserData>; pub type SessionData = Mutex<SessionUserData>;
pub struct SessionUserData { pub struct SessionUserData {
pub dt: OutputDamageTracker, pub dt: OutputDamageTracker,
@ -148,16 +149,17 @@ impl SessionHolder for Output {
impl FrameHolder for Output { impl FrameHolder for Output {
fn add_frame(&mut self, session: Session, frame: Frame) { fn add_frame(&mut self, session: Session, frame: Frame) {
self.user_data() self.user_data()
.insert_if_missing(PendingScreencopyBuffers::default); .insert_if_missing_threadsafe(PendingScreencopyBuffers::default);
self.user_data() self.user_data()
.get::<PendingScreencopyBuffers>() .get::<PendingScreencopyBuffers>()
.unwrap() .unwrap()
.borrow_mut() .lock()
.unwrap()
.push((session, DropableFrame(Some(frame)))); .push((session, DropableFrame(Some(frame))));
} }
fn remove_frame(&mut self, frame: &Frame) { fn remove_frame(&mut self, frame: &Frame) {
if let Some(pending) = self.user_data().get::<PendingScreencopyBuffers>() { if let Some(pending) = self.user_data().get::<PendingScreencopyBuffers>() {
pending.borrow_mut().retain(|(_, f)| f != frame); pending.lock().unwrap().retain(|(_, f)| f != frame);
} }
} }
fn take_pending_frames(&self) -> Vec<(Session, Frame)> { fn take_pending_frames(&self) -> Vec<(Session, Frame)> {
@ -165,7 +167,8 @@ impl FrameHolder for Output {
.get::<PendingScreencopyBuffers>() .get::<PendingScreencopyBuffers>()
.map(|pending| { .map(|pending| {
pending pending
.borrow_mut() .lock()
.unwrap()
.split_off(0) .split_off(0)
.into_iter() .into_iter()
.map(|(s, mut f)| (s, f.0.take().unwrap())) .map(|(s, mut f)| (s, f.0.take().unwrap()))