From 4bd0d2a1ef7ca032181d46c5866f50878c831dfe Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Sat, 7 Sep 2024 12:46:16 +0200 Subject: [PATCH] Move pthread::Errno to separate module. --- src/error.rs | 34 ++++++++++++++++++++++++++++++++++ src/fs.rs | 2 +- src/header/pthread/mod.rs | 21 +++++++++++---------- src/header/pthread/mutex.rs | 2 +- src/header/signal/mod.rs | 4 ++-- src/header/unistd/mod.rs | 2 +- src/lib.rs | 1 + src/platform/linux/mod.rs | 4 ++-- src/platform/linux/signal.rs | 2 +- src/platform/mod.rs | 2 +- src/platform/pal/mod.rs | 15 ++++++--------- src/platform/pal/signal.rs | 2 +- src/platform/redox/epoll.rs | 2 +- src/platform/redox/mod.rs | 17 ++++++----------- src/platform/redox/signal.rs | 2 +- src/platform/redox/socket.rs | 2 +- src/platform/rlb.rs | 2 +- src/pthread/mod.rs | 34 +--------------------------------- src/sync/cond.rs | 4 ++-- src/sync/mod.rs | 2 +- src/sync/pthread_mutex.rs | 1 + 21 files changed, 77 insertions(+), 80 deletions(-) create mode 100644 src/error.rs diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 00000000..f99feac7 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,34 @@ +use crate::platform::types::c_int; + +/// Positive error codes (EINVAL, not -EINVAL). +#[derive(Debug, Eq, PartialEq)] +// TODO: Move to a more generic place. +pub struct Errno(pub c_int); + +#[cfg(target_os = "redox")] +impl From<syscall::Error> for Errno { + fn from(value: syscall::Error) -> Self { + Errno(value.errno) + } +} +#[cfg(target_os = "redox")] +impl From<Errno> for syscall::Error { + fn from(value: Errno) -> Self { + syscall::Error::new(value.0) + } +} + +pub trait ResultExt<T> { + fn or_minus_one_errno(self) -> T; +} +impl<T: From<i8>> ResultExt<T> for Result<T, Errno> { + fn or_minus_one_errno(self) -> T { + match self { + Self::Ok(v) => v, + Self::Err(Errno(errno)) => unsafe { + crate::platform::ERRNO.set(errno); + T::from(-1) + }, + } + } +} diff --git a/src/fs.rs b/src/fs.rs index dcf77e2f..534da570 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -1,12 +1,12 @@ use crate::{ c_str::CStr, + error::ResultExt, header::{ fcntl::O_CREAT, unistd::{SEEK_CUR, SEEK_END, SEEK_SET}, }, io, platform::{types::*, Pal, Sys}, - pthread::ResultExt, }; use core::ops::Deref; diff --git a/src/header/pthread/mod.rs b/src/header/pthread/mod.rs index 0b8a6ba0..ce586952 100644 --- a/src/header/pthread/mod.rs +++ b/src/header/pthread/mod.rs @@ -3,15 +3,16 @@ use core::{cell::Cell, ptr::NonNull}; use crate::{ + error::Errno, header::{sched::*, time::timespec}, platform::{types::*, Pal, Sys}, pthread, }; -pub fn e(result: Result<(), pthread::Errno>) -> i32 { +pub fn e(result: Result<(), Errno>) -> i32 { match result { Ok(()) => 0, - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } @@ -75,7 +76,7 @@ pub use self::barrier::*; pub unsafe extern "C" fn pthread_cancel(thread: pthread_t) -> c_int { match pthread::cancel(&*thread.cast()) { Ok(()) => 0, - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } @@ -96,7 +97,7 @@ pub unsafe extern "C" fn pthread_create( core::ptr::write(pthread, ptr); 0 } - Err(pthread::Errno(code)) => code, + Err(Errno(code)) => code, } } @@ -104,7 +105,7 @@ pub unsafe extern "C" fn pthread_create( pub unsafe extern "C" fn pthread_detach(pthread: pthread_t) -> c_int { match pthread::detach(&*pthread.cast()) { Ok(()) => 0, - Err(pthread::Errno(errno)) => errno, + Err(Errno(errno)) => errno, } } @@ -134,7 +135,7 @@ pub unsafe extern "C" fn pthread_getcpuclockid( clock_out.write(clock); 0 } - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } @@ -151,7 +152,7 @@ pub unsafe extern "C" fn pthread_getschedparam( 0 } - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } @@ -167,7 +168,7 @@ pub unsafe extern "C" fn pthread_join(thread: pthread_t, retval: *mut *mut c_voi } 0 } - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } @@ -195,7 +196,7 @@ pub unsafe extern "C" fn pthread_setcancelstate(state: c_int, oldstate: *mut c_i } 0 } - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } #[no_mangle] @@ -209,7 +210,7 @@ pub unsafe extern "C" fn pthread_setcanceltype(ty: c_int, oldty: *mut c_int) -> } 0 } - Err(pthread::Errno(error)) => error, + Err(Errno(error)) => error, } } diff --git a/src/header/pthread/mutex.rs b/src/header/pthread/mutex.rs index 6b89f266..bdb87898 100644 --- a/src/header/pthread/mutex.rs +++ b/src/header/pthread/mutex.rs @@ -1,6 +1,6 @@ use super::*; -use crate::pthread::Errno; +use crate::error::Errno; // PTHREAD_MUTEX_INITIALIZER is defined in bits_pthread/cbindgen.toml diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index 4c2db6b9..674df6bf 100644 --- a/src/header/signal/mod.rs +++ b/src/header/signal/mod.rs @@ -5,9 +5,9 @@ use core::{mem, ptr}; use cbitset::BitSet; use crate::{ + error::{self, Errno, ResultExt}, header::{errno, time::timespec}, platform::{self, types::*, Pal, PalSignal, Sys}, - pthread::{self, Errno, ResultExt}, }; pub use self::sys::*; @@ -81,7 +81,7 @@ pub extern "C" fn killpg(pgrp: pid_t, sig: c_int) -> c_int { #[no_mangle] pub unsafe extern "C" fn pthread_kill(thread: pthread_t, sig: c_int) -> c_int { let os_tid = { - let pthread = &*(thread as *const pthread::Pthread); + let pthread = &*(thread as *const crate::pthread::Pthread); pthread.os_tid.get().read() }; crate::header::pthread::e(Sys::rlct_kill(os_tid, sig as usize)) diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index da7977e9..fdeb675f 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -9,6 +9,7 @@ use core::{ use crate::{ c_str::CStr, + error::ResultExt, header::{ crypt::{crypt_data, crypt_r}, errno, fcntl, limits, @@ -17,7 +18,6 @@ use crate::{ time::timespec, }, platform::{self, types::*, Pal, Sys}, - pthread::ResultExt, }; use alloc::collections::LinkedList; diff --git a/src/lib.rs b/src/lib.rs index 24afb604..1baebcaf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,6 +47,7 @@ pub mod c_str; pub mod c_vec; pub mod cxa; pub mod db; +pub mod error; pub mod fs; pub mod header; pub mod io; diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 1a03cfb7..a84922af 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -15,8 +15,8 @@ use crate::header::{ }; // use header::sys_times::tms; use crate::{ + error::Errno, header::{sys_utsname::utsname, time::timespec}, - pthread::Errno, }; mod epoll; @@ -243,7 +243,7 @@ impl Pal for Sys { addr: *mut u32, val: u32, deadline: Option<×pec>, - ) -> Result<(), crate::pthread::Errno> { + ) -> Result<(), Errno> { let deadline = deadline.map_or(0, |d| d as *const _ as usize); e_raw(unsafe { syscall!( diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs index 8055904c..8542b5c9 100644 --- a/src/platform/linux/signal.rs +++ b/src/platform/linux/signal.rs @@ -5,12 +5,12 @@ use super::{ e, e_raw, Sys, }; use crate::{ + error::Errno, header::{ signal::{sigaction, siginfo_t, sigset_t, stack_t, NSIG, SA_RESTORER}, sys_time::itimerval, time::timespec, }, - pthread::Errno, }; impl PalSignal for Sys { diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 9b598d68..0ce9a4c0 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -1,6 +1,6 @@ use crate::{ + error::ResultExt, io::{self, Read, Write}, - pthread::ResultExt, }; use alloc::{boxed::Box, vec::Vec}; use core::{cell::Cell, fmt, ptr}; diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index fb9d2dfc..007a0724 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -1,6 +1,7 @@ use super::types::*; use crate::{ c_str::CStr, + error::Errno, header::{ dirent::dirent, sys_resource::rlimit, @@ -10,7 +11,7 @@ use crate::{ sys_utsname::utsname, time::timespec, }, - pthread::{self, Errno}, + pthread, }; pub use self::epoll::PalEpoll; @@ -83,8 +84,8 @@ pub trait Pal { addr: *mut u32, val: u32, deadline: Option<×pec>, - ) -> Result<(), pthread::Errno>; - unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, pthread::Errno>; + ) -> Result<(), Errno>; + unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, Errno>; fn futimens(fd: c_int, times: *const timespec) -> c_int; @@ -182,12 +183,8 @@ pub trait Pal { fn pipe2(fildes: &mut [c_int], flags: c_int) -> c_int; - unsafe fn rlct_clone(stack: *mut usize) - -> Result<crate::pthread::OsTid, crate::pthread::Errno>; - unsafe fn rlct_kill( - os_tid: crate::pthread::OsTid, - signal: usize, - ) -> Result<(), crate::pthread::Errno>; + unsafe fn rlct_clone(stack: *mut usize) -> Result<crate::pthread::OsTid, Errno>; + unsafe fn rlct_kill(os_tid: crate::pthread::OsTid, signal: usize) -> Result<(), Errno>; fn current_os_tid() -> crate::pthread::OsTid; fn read(fildes: c_int, buf: &mut [u8]) -> Result<ssize_t, Errno>; diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs index cd9151a5..c03c5a9a 100644 --- a/src/platform/pal/signal.rs +++ b/src/platform/pal/signal.rs @@ -1,11 +1,11 @@ use super::super::{types::*, Pal}; use crate::{ + error::Errno, header::{ signal::{sigaction, siginfo_t, sigset_t, stack_t}, sys_time::itimerval, time::timespec, }, - pthread::Errno, }; pub trait PalSignal: Pal { diff --git a/src/platform/redox/epoll.rs b/src/platform/redox/epoll.rs index 60eaca05..57c485c2 100644 --- a/src/platform/redox/epoll.rs +++ b/src/platform/redox/epoll.rs @@ -4,11 +4,11 @@ use super::{ }; use crate::{ + error::ResultExt, fs::File, header::{errno::*, fcntl::*, signal::sigset_t, sys_epoll::*}, io::prelude::*, platform, - pthread::ResultExt, }; use core::{mem, slice}; use syscall::{ diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 8916d170..6634c10d 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -8,6 +8,7 @@ use syscall::{ use crate::{ c_str::{CStr, CString}, + error::{self, Errno, ResultExt}, fs::File, header::{ dirent::dirent, @@ -25,7 +26,6 @@ use crate::{ unistd::{F_OK, R_OK, W_OK, X_OK}, }, io::{self, prelude::*, BufReader}, - pthread::{self, Errno, ResultExt}, }; pub use redox_rt::proc::FdGuard; @@ -307,7 +307,7 @@ impl Pal for Sys { addr: *mut u32, val: u32, deadline: Option<×pec>, - ) -> Result<(), pthread::Errno> { + ) -> Result<(), Errno> { let deadline = deadline.map(|d| syscall::TimeSpec { tv_sec: d.tv_sec, tv_nsec: d.tv_nsec as i32, @@ -316,7 +316,7 @@ impl Pal for Sys { Ok(()) } #[inline] - unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, pthread::Errno> { + unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, Errno> { Ok(redox_rt::sys::sys_futex_wake(addr, num)?) } @@ -787,21 +787,16 @@ impl Pal for Sys { e(extra::pipe2(fds, flags as usize).map(|()| 0)) as c_int } - unsafe fn rlct_clone( - stack: *mut usize, - ) -> Result<crate::pthread::OsTid, crate::pthread::Errno> { + unsafe fn rlct_clone(stack: *mut usize) -> Result<crate::pthread::OsTid, Errno> { let _guard = clone::rdlock(); let res = clone::rlct_clone_impl(stack); res.map(|mut fd| crate::pthread::OsTid { thread_fd: fd.take(), }) - .map_err(|error| crate::pthread::Errno(error.errno)) + .map_err(|error| Errno(error.errno)) } - unsafe fn rlct_kill( - os_tid: crate::pthread::OsTid, - signal: usize, - ) -> Result<(), crate::pthread::Errno> { + unsafe fn rlct_kill(os_tid: crate::pthread::OsTid, signal: usize) -> Result<(), Errno> { redox_rt::sys::posix_kill_thread(os_tid.thread_fd, signal as u32)?; Ok(()) } diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index 5910f3e2..f88cd534 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -7,6 +7,7 @@ use super::{ e, Sys, }; use crate::{ + error::Errno, header::{ errno::{EINVAL, ENOSYS}, signal::{ @@ -17,7 +18,6 @@ use crate::{ time::timespec, }, platform::ERRNO, - pthread::Errno, }; impl PalSignal for Sys { diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index 54798b4d..6d91c539 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -7,6 +7,7 @@ use super::{ e, Sys, }; use crate::{ + error::ResultExt, header::{ arpa_inet::inet_aton, netinet_in::{in_addr, in_port_t, sockaddr_in}, @@ -15,7 +16,6 @@ use crate::{ sys_time::timeval, sys_un::sockaddr_un, }, - pthread::ResultExt, }; macro_rules! bind_or_connect { diff --git a/src/platform/rlb.rs b/src/platform/rlb.rs index e9beaea5..ec9ed098 100644 --- a/src/platform/rlb.rs +++ b/src/platform/rlb.rs @@ -3,8 +3,8 @@ use alloc::vec::Vec; use crate::platform::{types::*, Pal, Sys}; use crate::{ + error::ResultExt, header::unistd::{lseek, SEEK_SET}, - pthread::ResultExt, }; /// Implements an `Iterator` which returns on either newline or EOF. #[derive(Clone)] diff --git a/src/pthread/mod.rs b/src/pthread/mod.rs index 01a30600..2d2fc7b2 100644 --- a/src/pthread/mod.rs +++ b/src/pthread/mod.rs @@ -10,6 +10,7 @@ use core::{ use alloc::{boxed::Box, collections::BTreeMap}; use crate::{ + error::Errno, header::{errno::*, pthread as header, sched::sched_param, sys_mman}, ld_so::{ linker::Linker, @@ -82,39 +83,6 @@ pub struct OsTid { unsafe impl Send for Pthread {} unsafe impl Sync for Pthread {} -/// Positive error codes (EINVAL, not -EINVAL). -#[derive(Debug, Eq, PartialEq)] -// TODO: Move to a more generic place. -pub struct Errno(pub c_int); - -#[cfg(target_os = "redox")] -impl From<syscall::Error> for Errno { - fn from(value: syscall::Error) -> Self { - Errno(value.errno) - } -} -#[cfg(target_os = "redox")] -impl From<Errno> for syscall::Error { - fn from(value: Errno) -> Self { - syscall::Error::new(value.0) - } -} - -pub trait ResultExt<T> { - fn or_minus_one_errno(self) -> T; -} -impl<T: From<i8>> ResultExt<T> for Result<T, Errno> { - fn or_minus_one_errno(self) -> T { - match self { - Self::Ok(v) => v, - Self::Err(Errno(errno)) => unsafe { - crate::platform::ERRNO.set(errno); - T::from(-1) - }, - } - } -} - #[derive(Clone, Copy, Debug)] pub struct Retval(pub *mut c_void); diff --git a/src/sync/cond.rs b/src/sync/cond.rs index aa3b6247..1b3d8460 100644 --- a/src/sync/cond.rs +++ b/src/sync/cond.rs @@ -1,8 +1,8 @@ // Used design from https://www.remlab.net/op/futex-condvar.shtml use crate::{ + error::Errno, header::{pthread::*, time::timespec}, - pthread::Errno, }; use core::sync::atomic::{AtomicU32 as AtomicUint, Ordering}; @@ -12,7 +12,7 @@ pub struct Cond { prev: AtomicUint, } -type Result<T, E = crate::pthread::Errno> = core::result::Result<T, E>; +type Result<T, E = Errno> = core::result::Result<T, E>; impl Cond { pub fn new() -> Self { diff --git a/src/sync/mod.rs b/src/sync/mod.rs index dc4ecd4f..254bd681 100644 --- a/src/sync/mod.rs +++ b/src/sync/mod.rs @@ -19,12 +19,12 @@ pub use self::{ }; use crate::{ + error::Errno, header::{ errno::{EAGAIN, ETIMEDOUT}, time::timespec, }, platform::{types::*, Pal, Sys}, - pthread::Errno, }; use core::{ mem::MaybeUninit, diff --git a/src/sync/pthread_mutex.rs b/src/sync/pthread_mutex.rs index 030cac85..cc9b0115 100644 --- a/src/sync/pthread_mutex.rs +++ b/src/sync/pthread_mutex.rs @@ -4,6 +4,7 @@ use core::{ }; use crate::{ + error::Errno, header::{errno::*, pthread::*, time::timespec}, pthread::*, }; -- GitLab