Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MSRV 1.63: Use libstd instead of libc::open and instead of libpthreads's Mutex. #458

Closed
wants to merge 3 commits into from

Commits on Jun 18, 2024

  1. use_file: Use std::File instead of DropGuard.

    For now, still use `libc::{poll,read}`. But use `File::open` to open
    the files, instead of using `DropGuard`.
    
    While doing this, switch to the `RawFd` type alias from `libc::c_int`.
    briansmith committed Jun 18, 2024
    Configuration menu
    Copy the full SHA
    001220b View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    7ac1473 View commit details
    Browse the repository at this point in the history
  3. use_file: std::sync::Mutex, dropping all libpthread use.

    pthreads mutexes are not safe to move. While it is very unlikely that
    the mutex we create will ever be moved, we don't actively do anything
    to actively prevent it from being moved. (libstd, when it used/uses
    pthreads mutexes, would box them to prevent them from being moved.)
    
    Also, now on Linux and Android (and many other targets for which we
    don't use use_std), libstd uses futexes instead of pthreads mutexes.
    Thus using libstd's Mutex will be more efficient and avoid adding an
    often-otherwise-unnecessary libpthreads dependency on these targets.
    
      * Linux, Android: Futex [1].
      * Haiku, Redox, NTO, AIX: pthreads [2].
      * others: not using `use_file`.
    
    This will not affect our plans for *-*-linux-none, since we don't
    plan to use `use_file` for it.
    
    This breaks 32-bit x86 QNX Neutrino, which doesn't have libstd
    because the target itself is abandoned [3]. the other QNX Neutrino
    targets didn't get libstd support until Rust 1.69, so this
    effectively raises the MSRV for them to 1.69.
    
    I tried to use `Once` to avoid the MSRV increase but it doesn't support
    fallible initialization. `OnceLock` wasn't added until 1.70 but even
    then, `OnceLock::get_or_try_init` is still unstable.
    
    On x86_64 Linux, this change removes all libpthreads dependencies:
    
    ```diff
    -       pthread_mutex_lock
    -       pthread_mutex_unlock
    ```
    
    and adds these libstd dependencies:
    
    ```diff
    +       std::panicking::panic_count::GLOBAL_PANIC_COUNT
    +       std::panicking::panic_count::is_zero_slow_path
    +       std::sys::sync::mutex::futex::Mutex::lock_contended
    +       std::sys::sync::mutex::futex::Mutex::wake
    ```
    
    as measured using `cargo asm`.
    
    [1] https://github.com/rust-lang/rust/blob/c1dba09f263cbff6170f130aa418e28bdf22bd96/library/std/src/sys/sync/mutex/mod.rs#L4-L10
    [2] https://github.com/rust-lang/rust/blob/c1dba09f263cbff6170f130aa418e28bdf22bd96/library/std/src/sys/sync/mutex/mod.rs#L17-L20
    [3] rust-random#453 (comment)
    briansmith committed Jun 18, 2024
    Configuration menu
    Copy the full SHA
    2d9f884 View commit details
    Browse the repository at this point in the history