1
0
Fork 0
forked from wry/wry

portal: use atomics for shared memory access

This commit is contained in:
Julian Orth 2024-04-19 00:25:41 +02:00
parent 9de741f529
commit 137d5fe200
2 changed files with 16 additions and 10 deletions

View file

@ -5,7 +5,10 @@ mod pw_debug;
use { use {
crate::pipewire::pw_parser::{PwParser, PwParserError}, crate::pipewire::pw_parser::{PwParser, PwParserError},
bstr::BStr, bstr::BStr,
std::fmt::{Debug, Formatter}, std::{
fmt::{Debug, Formatter},
sync::atomic::AtomicU32,
},
uapi::{c, Pod}, uapi::{c, Pod},
}; };
@ -1425,10 +1428,10 @@ bitflags! {
} }
#[repr(C)] #[repr(C)]
#[derive(Debug, Copy, Clone)] #[derive(Debug)]
pub struct spa_io_buffers { pub struct spa_io_buffers {
pub status: SpaStatus, pub status: AtomicU32,
pub buffer_id: u32, pub buffer_id: AtomicU32,
} }
unsafe impl Pod for spa_io_buffers {} unsafe impl Pod for spa_io_buffers {}

View file

@ -41,6 +41,7 @@ use {
cell::{Cell, RefCell}, cell::{Cell, RefCell},
ops::Deref, ops::Deref,
rc::Rc, rc::Rc,
sync::atomic::Ordering::{Acquire, Relaxed, Release},
}, },
}; };
@ -319,15 +320,17 @@ impl UsrJayScreencastOwner for StartedScreencast {
let mut used = false; let mut used = false;
if let Some(io) = self.port.io_buffers.lock().values().next() { if let Some(io) = self.port.io_buffers.lock().values().next() {
let io = io.write(); let io = io.write();
if io.status != SPA_STATUS_HAVE_DATA { let status = io.status.load(Acquire);
if status != SPA_STATUS_HAVE_DATA.0 {
used = true; used = true;
if io.buffer_id != ev.idx { let buffer_id = io.buffer_id.load(Relaxed);
if (io.buffer_id as usize) < self.buffers.borrow_mut().len() { if buffer_id != ev.idx {
self.jay_screencast.release_buffer(io.buffer_id as usize); if (buffer_id as usize) < self.buffers.borrow_mut().len() {
self.jay_screencast.release_buffer(buffer_id as usize);
} }
} }
io.buffer_id = ev.idx; io.buffer_id.store(ev.idx, Relaxed);
io.status = SPA_STATUS_HAVE_DATA; io.status.store(SPA_STATUS_HAVE_DATA.0, Release);
} }
} }
if !used { if !used {