diff --git a/src/lib.rs b/src/lib.rs index 89afd17..abea3b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,19 +5,16 @@ pub use types::{NiceLevel, Priority}; #[derive(thiserror::Error, Debug)] pub enum Error { - #[error("Permission denied")] - PermissionDenied, + #[error("Permission denied: {0}")] + PermissionDenied(String), - #[error("Invalid PID")] - InvalidPid, + #[error("Invalid PID or Thread ID")] + InvalidPidOrTid, - #[error("Invalid thread ID")] - InvalidThreadId, - - #[error("Got invalid max priority from RTKit")] + #[error("Got invalid max priority from RTKit: {0}")] InvalidMaxPriority(i32), - #[error("Got invalid min nice level from RTKit")] + #[error("Got invalid min nice level from RTKit: {0}")] InvalidMinNiceLevel(i32), #[error(transparent)] @@ -54,8 +51,10 @@ pub fn set_thread_priority(tid: u64, priority: Option) -> Result Error::PermissionDenied, - e => Error::ZbusMethodError(e), + zbus::fdo::Error::AccessDenied(err) => Error::PermissionDenied(err), + // NOTE: RTKit returns "No such file or directory" for invalid tids. + zbus::fdo::Error::Failed(err) if err == "No such file or directory" => Error::InvalidPidOrTid, + err => Error::ZbusMethodError(err), }) } @@ -84,8 +83,10 @@ pub fn set_process_thread_priority( .make_thread_realtime_with_pid(pid, tid, priority.value()) .map(|_| priority) .map_err(|e| match e { - zbus::fdo::Error::AccessDenied(_) => Error::PermissionDenied, - e => Error::ZbusMethodError(e), + zbus::fdo::Error::AccessDenied(err) => Error::PermissionDenied(err), + // NOTE: RTKit returns "No such file or directory" for invalid tids. + zbus::fdo::Error::Failed(err) if err == "No such file or directory" => Error::InvalidPidOrTid, + err => Error::ZbusMethodError(err), }) } @@ -118,8 +119,10 @@ pub fn set_thread_nice_level(tid: u64, nice_level: Option) -> Result< .make_thread_high_priority(tid, nice_level.value()) .map(|_| nice_level) .map_err(|e| match e { - zbus::fdo::Error::AccessDenied(_) => Error::PermissionDenied, - e => Error::ZbusMethodError(e), + zbus::fdo::Error::AccessDenied(err) => Error::PermissionDenied(err), + // NOTE: RTKit returns "No such file or directory" for invalid tids. + zbus::fdo::Error::Failed(err) if err == "No such file or directory" => Error::InvalidPidOrTid, + err => Error::ZbusMethodError(err), }) } @@ -148,7 +151,9 @@ pub fn set_process_thread_nice_level( .make_thread_high_priority_with_pid(pid, tid, nice_level.value()) .map(|_| nice_level) .map_err(|e| match e { - zbus::fdo::Error::AccessDenied(_) => Error::PermissionDenied, - e => Error::ZbusMethodError(e), + zbus::fdo::Error::AccessDenied(err) => Error::PermissionDenied(err), + // NOTE: RTKit returns "No such file or directory" for invalid tids. + zbus::fdo::Error::Failed(err) if err == "No such file or directory" => Error::InvalidPidOrTid, + err => Error::ZbusMethodError(err), }) }