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

alloc: Add unstable Cfg feature `no_global_oom_handling #84266

Merged

Commits on May 5, 2021

  1. Remote test for alloc extern_crate feature.

    This functionality was removed in
    45bf1ed, but the test was left by
    mistake.
    Ericson2314 committed May 5, 2021
    Configuration menu
    Copy the full SHA
    3ec0baa View commit details
    Browse the repository at this point in the history
  2. alloc: Add unstable Cfg feature no-global_oom_handling

    For certain sorts of systems, programming, it's deemed essential that
    all allocation failures be explicitly handled where they occur. For
    example, see Linus Torvald's opinion in [1]. Merely not calling global
    panic handlers, or always `try_reserving` first (for vectors), is not
    deemed good enough, because the mere presence of the global OOM handlers
    is burdens static analysis.
    
    One option for these projects to use rust would just be to skip `alloc`,
    rolling their own allocation abstractions.  But this would, in my
    opinion be a real shame. `alloc` has a few `try_*` methods already, and
    we could easily have more. Features like custom allocator support also
    demonstrate and existing to support diverse use-cases with the same
    abstractions.
    
    A natural way to add such a feature flag would a Cargo feature, but
    there are currently uncertainties around how std library crate's Cargo
    features may or not be stable, so to avoid any risk of stabilizing by
    mistake we are going with a more low-level "raw cfg" token, which
    cannot be interacted with via Cargo alone.
    
    Note also that since there is no notion of "default cfg tokens" outside
    of Cargo features, we have to invert the condition from
    `global_oom_handling` to to `not(no_global_oom_handling)`. This breaks
    the monotonicity that would be important for a Cargo feature (i.e.
    turning on more features should never break compatibility), but it
    doesn't matter for raw cfg tokens which are not intended to be
    "constraint solved" by Cargo or anything else.
    
    To support this use-case we create a new feature, "global-oom-handling",
    on by default, and put the global OOM handler infra and everything else
    it that depends on it behind it. By default, nothing is changed, but
    users concerned about global handling can make sure it is disabled, and
    be confident that all OOM handling is local and explicit.
    
    For this first iteration, non-flat collections are outright disabled.
    `Vec` and `String` don't yet have `try_*` allocation methods, but are
    kept anyways since they can be oom-safely created "from parts", and we
    hope to add those `try_` methods in the future.
    
    [1]: https://lore.kernel.org/lkml/CAHk-=wh_sNLoz84AUUzuqXEsYH35u=8HV3vK-jbRbJ_B-JjGrg@mail.gmail.com/
    Ericson2314 committed May 5, 2021
    Configuration menu
    Copy the full SHA
    19be438 View commit details
    Browse the repository at this point in the history