mirror of
https://github.com/pinnacle-comp/pinnacle.git
synced 2025-01-30 20:34:49 +01:00
Improve error handling
This commit is contained in:
parent
bbb711f1a9
commit
edba4d2424
3 changed files with 49 additions and 8 deletions
|
@ -17,6 +17,7 @@ pkgs.mkShell {
|
||||||
pkgs.libGL
|
pkgs.libGL
|
||||||
pkgs.libGL.dev
|
pkgs.libGL.dev
|
||||||
pkgs.egl-wayland
|
pkgs.egl-wayland
|
||||||
|
pkgs.xwayland
|
||||||
];
|
];
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${pkgs.wayland}/lib:${pkgs.libxkbcommon}/lib:${pkgs.libGL}/lib
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${pkgs.wayland}/lib:${pkgs.libxkbcommon}/lib:${pkgs.libGL}/lib
|
||||||
|
|
20
src/api.rs
20
src/api.rs
|
@ -89,14 +89,28 @@ impl PinnacleSocketSource {
|
||||||
pub fn new(sender: Sender<Msg>) -> Result<Self, io::Error> {
|
pub fn new(sender: Sender<Msg>) -> Result<Self, io::Error> {
|
||||||
let socket_path = Path::new(SOCKET_PATH);
|
let socket_path = Path::new(SOCKET_PATH);
|
||||||
|
|
||||||
|
// TODO: use anyhow
|
||||||
|
|
||||||
if let Ok(exists) = socket_path.try_exists() {
|
if let Ok(exists) = socket_path.try_exists() {
|
||||||
if exists {
|
if exists {
|
||||||
std::fs::remove_file(socket_path)?;
|
if let Err(err) = std::fs::remove_file(socket_path) {
|
||||||
|
tracing::error!("Failed to remove old socket: {err}");
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let listener = UnixListener::bind(socket_path)?;
|
let listener = match UnixListener::bind(socket_path) {
|
||||||
listener.set_nonblocking(true)?;
|
Ok(listener) => listener,
|
||||||
|
Err(err) => {
|
||||||
|
tracing::error!("Failed to bind to socket: {err}");
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Err(err) = listener.set_nonblocking(true) {
|
||||||
|
tracing::error!("Failed to set socket to nonblocking: {err}");
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
|
|
||||||
let socket = Generic::new(listener, Interest::READ, Mode::Level);
|
let socket = Generic::new(listener, Interest::READ, Mode::Level);
|
||||||
|
|
||||||
|
|
36
src/state.rs
36
src/state.rs
|
@ -749,6 +749,10 @@ impl<B: Backend> State<B> {
|
||||||
let socket_name = socket.socket_name().to_os_string();
|
let socket_name = socket.socket_name().to_os_string();
|
||||||
|
|
||||||
std::env::set_var("WAYLAND_DISPLAY", socket_name.clone());
|
std::env::set_var("WAYLAND_DISPLAY", socket_name.clone());
|
||||||
|
tracing::info!(
|
||||||
|
"Set WAYLAND_DISPLAY to {}",
|
||||||
|
socket_name.clone().to_string_lossy()
|
||||||
|
);
|
||||||
|
|
||||||
// Opening a new process will use up a few file descriptors, around 10 for Alacritty, for
|
// Opening a new process will use up a few file descriptors, around 10 for Alacritty, for
|
||||||
// example. Because of this, opening up only around 100 processes would exhaust the file
|
// example. Because of this, opening up only around 100 processes would exhaust the file
|
||||||
|
@ -756,12 +760,15 @@ impl<B: Backend> State<B> {
|
||||||
//
|
//
|
||||||
// To fix this, I just set the limit to be higher. As Pinnacle is the whole graphical
|
// To fix this, I just set the limit to be higher. As Pinnacle is the whole graphical
|
||||||
// environment, I *think* this is ok.
|
// environment, I *think* this is ok.
|
||||||
|
tracing::info!("Trying to raise file descriptor limit...");
|
||||||
if let Err(err) = smithay::reexports::nix::sys::resource::setrlimit(
|
if let Err(err) = smithay::reexports::nix::sys::resource::setrlimit(
|
||||||
smithay::reexports::nix::sys::resource::Resource::RLIMIT_NOFILE,
|
smithay::reexports::nix::sys::resource::Resource::RLIMIT_NOFILE,
|
||||||
65536,
|
65536,
|
||||||
65536 * 2,
|
65536 * 2,
|
||||||
) {
|
) {
|
||||||
tracing::error!("Could not raise fd limit: errno {err}");
|
tracing::error!("Could not raise fd limit: errno {err}");
|
||||||
|
} else {
|
||||||
|
tracing::info!("Fd raise success!");
|
||||||
}
|
}
|
||||||
|
|
||||||
loop_handle.insert_source(socket, |stream, _metadata, data| {
|
loop_handle.insert_source(socket, |stream, _metadata, data| {
|
||||||
|
@ -789,7 +796,17 @@ impl<B: Backend> State<B> {
|
||||||
// TODO: there should only ever be one client working at a time, and creating a new client
|
// TODO: there should only ever be one client working at a time, and creating a new client
|
||||||
// | when one is already running should be impossible.
|
// | when one is already running should be impossible.
|
||||||
// INFO: this source try_clone()s the stream
|
// INFO: this source try_clone()s the stream
|
||||||
loop_handle.insert_source(PinnacleSocketSource::new(tx_channel)?, |stream, _, data| {
|
|
||||||
|
// TODO: probably use anyhow or something
|
||||||
|
let socket_source = match PinnacleSocketSource::new(tx_channel) {
|
||||||
|
Ok(source) => source,
|
||||||
|
Err(err) => {
|
||||||
|
tracing::error!("Failed to create the socket source: {err}");
|
||||||
|
Err(err)?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
loop_handle.insert_source(socket_source, |stream, _, data| {
|
||||||
if let Some(old_stream) = data
|
if let Some(old_stream) = data
|
||||||
.state
|
.state
|
||||||
.api_state
|
.api_state
|
||||||
|
@ -817,7 +834,10 @@ impl<B: Backend> State<B> {
|
||||||
});
|
});
|
||||||
|
|
||||||
if Path::new(&config_path).exists() {
|
if Path::new(&config_path).exists() {
|
||||||
let lua_path = std::env::var("LUA_PATH").expect("Lua is not installed!");
|
let lua_path = std::env::var("LUA_PATH").unwrap_or_else(|_| {
|
||||||
|
tracing::info!("LUA_PATH was not set, using empty string");
|
||||||
|
"".to_string()
|
||||||
|
});
|
||||||
let mut local_lua_path = std::env::current_dir()
|
let mut local_lua_path = std::env::current_dir()
|
||||||
.expect("Couldn't get current dir")
|
.expect("Couldn't get current dir")
|
||||||
.to_string_lossy()
|
.to_string_lossy()
|
||||||
|
@ -826,15 +846,21 @@ impl<B: Backend> State<B> {
|
||||||
let new_lua_path =
|
let new_lua_path =
|
||||||
format!("{local_lua_path}/?.lua;{local_lua_path}/?/init.lua;{local_lua_path}/lib/?.lua;{local_lua_path}/lib/?/init.lua;{lua_path}");
|
format!("{local_lua_path}/?.lua;{local_lua_path}/?/init.lua;{local_lua_path}/lib/?.lua;{local_lua_path}/lib/?/init.lua;{lua_path}");
|
||||||
|
|
||||||
let lua_cpath = std::env::var("LUA_CPATH").expect("Lua is not installed!");
|
let lua_cpath = std::env::var("LUA_CPATH").unwrap_or_else(|_| {
|
||||||
|
tracing::info!("LUA_CPATH was not set, using empty string");
|
||||||
|
"".to_string()
|
||||||
|
});
|
||||||
let new_lua_cpath = format!("{local_lua_path}/lib/?.so;{lua_cpath}");
|
let new_lua_cpath = format!("{local_lua_path}/lib/?.so;{lua_cpath}");
|
||||||
|
|
||||||
std::process::Command::new("lua")
|
if let Err(err) = std::process::Command::new("lua")
|
||||||
.arg(config_path)
|
.arg(config_path)
|
||||||
.env("LUA_PATH", new_lua_path)
|
.env("LUA_PATH", new_lua_path)
|
||||||
.env("LUA_CPATH", new_lua_cpath)
|
.env("LUA_CPATH", new_lua_cpath)
|
||||||
.spawn()
|
.spawn()
|
||||||
.expect("Could not start config process");
|
{
|
||||||
|
tracing::error!("Failed to start Lua: {err}");
|
||||||
|
return Err(err)?;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
tracing::error!("Could not find {}", config_path);
|
tracing::error!("Could not find {}", config_path);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue