Use while loop instead of break so main loop can be exited and cleaned up from anywhere

This commit is contained in:
2025-05-13 20:40:12 -07:00
parent a1aa3bc2eb
commit 7dcf3d80bb
2 changed files with 35 additions and 32 deletions

View File

@@ -103,6 +103,7 @@ impl ShmPool {
impl Drop for ShmPool {
fn drop(&mut self) {
println!("Dropping ShmPool!");
unsafe { munmap(self.addr, self.size); }
}
}

View File

@@ -1,10 +1,9 @@
use std::{collections::HashMap, env::var, error::Error, fmt::Debug, io::{IoSliceMut, Write}, os::unix::net::{AncillaryData, SocketAncillary, UnixStream}, sync::{atomic::{AtomicU32, Ordering}, mpsc, Arc, Mutex}, thread::{self}, time::Duration, u32};
use std::{collections::HashMap, env::var, error::Error, fmt::Debug, io::{IoSliceMut, Write}, os::unix::net::{AncillaryData, SocketAncillary, UnixStream}, sync::{atomic::{AtomicU32, AtomicBool, Ordering}, mpsc, Arc, Mutex}, thread::{self}, time::Duration, u32};
use crate::wayland::{shm, vec_utils::WlMessage};
#[derive(PartialEq)]
pub enum ThreadMessage {
Exit,
}
use ThreadMessage::*;
@@ -17,6 +16,7 @@ struct WlHeader {
pub struct WlClient {
pub socket: Mutex<UnixStream>,
pub sender: mpsc::Sender<ThreadMessage>,
pub running: AtomicBool,
pub current_id: AtomicU32,
pub registry_id: AtomicU32,
pub shm_id: AtomicU32,
@@ -48,6 +48,7 @@ impl WlClient {
let mut arc_wl_client = Arc::new(WlClient {
socket: Mutex::new(sock),
sender,
running: AtomicBool::from(false),
current_id: AtomicU32::from(1),
registry_id: AtomicU32::from(0),
shm_id: AtomicU32::from(0),
@@ -65,27 +66,25 @@ impl WlClient {
keymap_fd: Mutex::new(None),
});
arc_wl_client.wl_display_get_registry();
arc_wl_client.running.store(true, Ordering::Relaxed);
let wl_client = arc_wl_client.clone();
let readloop = thread::spawn(move || {
loop {
let readloop = thread::Builder::new().name("readloop".to_string()).spawn(move || {
while wl_client.running.load(Ordering::Relaxed) {
wl_client.read_event();
}
});
})?;
let wl_client = arc_wl_client.clone();
let recvloop = thread::spawn(move || {
'recv: loop {
match receiver.recv().unwrap() {
Exit => {
thread::sleep(Duration::from_secs(1));
break 'recv;
}
}
}
});
recvloop.join();
// let wl_client = arc_wl_client.clone();
// let recvloop = thread::Builder::new().name("recvloop".to_string()).spawn(move || {
// while wl_client.running.load(Ordering::Relaxed) {
// match receiver.recv().unwrap() {
// }
// }
// })?;
//
// recvloop.join();
readloop.join();
Ok(())
}
@@ -140,6 +139,7 @@ impl WlClient {
}
else if header.object == 1 && header.opcode == 0 { // wl_display::error
WlClient::wl_display_error(&event);
dbg!(&self);
}
else if header.object == self.shm_id.load(Ordering::Relaxed) && header.opcode == 0 { // wl_shm::format
WlClient::wl_shm_format(&event);
@@ -203,10 +203,10 @@ impl WlClient {
pub fn exit(&self) {
println!("Exiting!");
self.destroy_object(&self.buffer_id, 0);
self.destroy_object(&self.surface_id, 0);
self.destroy_object(&self.layer_surface_id, 7);
self.sender.send(ThreadMessage::Exit);
self.destroy_object(&self.buffer_id, 0);
self.keymap_fd.lock().unwrap().take();
self.running.store(false, Ordering::Relaxed);
}
}
@@ -216,6 +216,7 @@ impl Debug for WlClient {
current_id: {},
registry_id: {},
shm_id: {},
shmpool_id: {},
buffer_id: {},
compositor_id: {},
surface_id: {},
@@ -225,17 +226,18 @@ impl Debug for WlClient {
seat_id: {},
keyboard_id: {},
}}",
self.current_id.load(Ordering::Relaxed),
self.registry_id.load(Ordering::Relaxed),
self.shm_id.load(Ordering::Relaxed),
self.buffer_id.load(Ordering::Relaxed),
self.compositor_id.load(Ordering::Relaxed),
self.surface_id.load(Ordering::Relaxed),
self.xdg_wm_base_id.load(Ordering::Relaxed),
self.layer_shell_id.load(Ordering::Relaxed),
self.layer_surface_id.load(Ordering::Relaxed),
self.seat_id.load(Ordering::Relaxed),
self.keyboard_id.load(Ordering::Relaxed),
self.current_id.load(Ordering::Relaxed),
self.registry_id.load(Ordering::Relaxed),
self.shm_id.load(Ordering::Relaxed),
self.shmpool_id.load(Ordering::Relaxed),
self.buffer_id.load(Ordering::Relaxed),
self.compositor_id.load(Ordering::Relaxed),
self.surface_id.load(Ordering::Relaxed),
self.xdg_wm_base_id.load(Ordering::Relaxed),
self.layer_shell_id.load(Ordering::Relaxed),
self.layer_surface_id.load(Ordering::Relaxed),
self.seat_id.load(Ordering::Relaxed),
self.keyboard_id.load(Ordering::Relaxed),
)
}
}