Use while loop instead of break so main loop can be exited and cleaned up from anywhere
This commit is contained in:
@@ -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); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user