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 { impl Drop for ShmPool {
fn drop(&mut self) { fn drop(&mut self) {
println!("Dropping ShmPool!");
unsafe { munmap(self.addr, self.size); } 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}; use crate::wayland::{shm, vec_utils::WlMessage};
#[derive(PartialEq)] #[derive(PartialEq)]
pub enum ThreadMessage { pub enum ThreadMessage {
Exit,
} }
use ThreadMessage::*; use ThreadMessage::*;
@@ -17,6 +16,7 @@ struct WlHeader {
pub struct WlClient { pub struct WlClient {
pub socket: Mutex<UnixStream>, pub socket: Mutex<UnixStream>,
pub sender: mpsc::Sender<ThreadMessage>, pub sender: mpsc::Sender<ThreadMessage>,
pub running: AtomicBool,
pub current_id: AtomicU32, pub current_id: AtomicU32,
pub registry_id: AtomicU32, pub registry_id: AtomicU32,
pub shm_id: AtomicU32, pub shm_id: AtomicU32,
@@ -48,6 +48,7 @@ impl WlClient {
let mut arc_wl_client = Arc::new(WlClient { let mut arc_wl_client = Arc::new(WlClient {
socket: Mutex::new(sock), socket: Mutex::new(sock),
sender, sender,
running: AtomicBool::from(false),
current_id: AtomicU32::from(1), current_id: AtomicU32::from(1),
registry_id: AtomicU32::from(0), registry_id: AtomicU32::from(0),
shm_id: AtomicU32::from(0), shm_id: AtomicU32::from(0),
@@ -65,27 +66,25 @@ impl WlClient {
keymap_fd: Mutex::new(None), keymap_fd: Mutex::new(None),
}); });
arc_wl_client.wl_display_get_registry(); arc_wl_client.wl_display_get_registry();
arc_wl_client.running.store(true, Ordering::Relaxed);
let wl_client = arc_wl_client.clone(); let wl_client = arc_wl_client.clone();
let readloop = thread::spawn(move || { let readloop = thread::Builder::new().name("readloop".to_string()).spawn(move || {
loop { while wl_client.running.load(Ordering::Relaxed) {
wl_client.read_event(); wl_client.read_event();
} }
}); })?;
let wl_client = arc_wl_client.clone(); // let wl_client = arc_wl_client.clone();
let recvloop = thread::spawn(move || { // let recvloop = thread::Builder::new().name("recvloop".to_string()).spawn(move || {
'recv: loop { // while wl_client.running.load(Ordering::Relaxed) {
match receiver.recv().unwrap() { // match receiver.recv().unwrap() {
Exit => { // }
thread::sleep(Duration::from_secs(1)); // }
break 'recv; // })?;
} //
} // recvloop.join();
} readloop.join();
});
recvloop.join();
Ok(()) Ok(())
} }
@@ -140,6 +139,7 @@ impl WlClient {
} }
else if header.object == 1 && header.opcode == 0 { // wl_display::error else if header.object == 1 && header.opcode == 0 { // wl_display::error
WlClient::wl_display_error(&event); WlClient::wl_display_error(&event);
dbg!(&self);
} }
else if header.object == self.shm_id.load(Ordering::Relaxed) && header.opcode == 0 { // wl_shm::format else if header.object == self.shm_id.load(Ordering::Relaxed) && header.opcode == 0 { // wl_shm::format
WlClient::wl_shm_format(&event); WlClient::wl_shm_format(&event);
@@ -203,10 +203,10 @@ impl WlClient {
pub fn exit(&self) { pub fn exit(&self) {
println!("Exiting!"); 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.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: {}, current_id: {},
registry_id: {}, registry_id: {},
shm_id: {}, shm_id: {},
shmpool_id: {},
buffer_id: {}, buffer_id: {},
compositor_id: {}, compositor_id: {},
surface_id: {}, surface_id: {},
@@ -225,17 +226,18 @@ impl Debug for WlClient {
seat_id: {}, seat_id: {},
keyboard_id: {}, keyboard_id: {},
}}", }}",
self.current_id.load(Ordering::Relaxed), self.current_id.load(Ordering::Relaxed),
self.registry_id.load(Ordering::Relaxed), self.registry_id.load(Ordering::Relaxed),
self.shm_id.load(Ordering::Relaxed), self.shm_id.load(Ordering::Relaxed),
self.buffer_id.load(Ordering::Relaxed), self.shmpool_id.load(Ordering::Relaxed),
self.compositor_id.load(Ordering::Relaxed), self.buffer_id.load(Ordering::Relaxed),
self.surface_id.load(Ordering::Relaxed), self.compositor_id.load(Ordering::Relaxed),
self.xdg_wm_base_id.load(Ordering::Relaxed), self.surface_id.load(Ordering::Relaxed),
self.layer_shell_id.load(Ordering::Relaxed), self.xdg_wm_base_id.load(Ordering::Relaxed),
self.layer_surface_id.load(Ordering::Relaxed), self.layer_shell_id.load(Ordering::Relaxed),
self.seat_id.load(Ordering::Relaxed), self.layer_surface_id.load(Ordering::Relaxed),
self.keyboard_id.load(Ordering::Relaxed), self.seat_id.load(Ordering::Relaxed),
self.keyboard_id.load(Ordering::Relaxed),
) )
} }
} }