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

Rewrite the aio module #1713

Merged
merged 1 commit into from
May 14, 2022
Merged

Rewrite the aio module #1713

merged 1 commit into from
May 14, 2022

Commits on May 14, 2022

  1. Rewrite the aio module

    The existing AIO implementation has some problems:
    1) The in_progress field is checked at runtime, not compile time.
    2) The mutable field is checked at runtime, not compile time.
    3) A downstream lio_listio user must store extra state to track whether
       the whole operation is partially, completely, or not at all
       submitted.
    4) Nix does heap allocation itself, rather than allowing the caller to
       choose it.  This can result in double (or triple, or quadruple)
       boxing.
    5) There's no easy way to use lio_listio to submit multiple operations with
       a single syscall, but poll each individually.
    6) The lio_listio usage is far from transparent and zero-cost.
    7) No aio_readv or aio_writev support.
    8) priority has type c_int; should be i32
    9) aio_return should return a usize instead of an isize, since it only
       uses negative values to indicate errors, which Rust represents via
       the Result type.
    
    This rewrite solves several problems:
    1) Unsolved.  I don't think it can be solved without something like
       C++'s guaranteed type elision.  It might require changing the
       signature of Future::poll too.
    2) Solved.
    3) Solved, by the new in_progress method and by removing the complicated
       lio_listio resubmit code.
    4) Solved.
    5) Solved.
    6) Solved, by removing the lio_listo resubmit code.  It can be
       reimplemented downstream if necessary.  Or even in Nix, but it
       doesn't fit Nix's theme of zero-cost abstractions.
    7) Solved.
    8) Solved.
    9) Solved.
    
    The rewrite includes functions that don't work on FreeBSD, so add CI
    testing for FreeBSD 14 too.
    
    By default only enable tests that will pass on FreeBSD 12.3.  But run a
    CI job on FreeBSD 14 and set a flag that will enable such tests.
    asomers committed May 14, 2022
    Configuration menu
    Copy the full SHA
    0c07a9e View commit details
    Browse the repository at this point in the history