Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/liballoc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@

#![feature(allocator)]
#![feature(box_syntax)]
#![feature(cfg_target_has_atomic)]
#![feature(coerce_unsized)]
#![feature(const_fn)]
#![feature(core_intrinsics)]
Expand Down Expand Up @@ -117,6 +118,7 @@ mod boxed {
}
#[cfg(test)]
mod boxed_test;
#[cfg(target_has_atomic = "ptr")]
pub mod arc;
pub mod rc;
pub mod raw_vec;
Expand Down
15 changes: 15 additions & 0 deletions src/liballoc/oom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#[cfg(target_has_atomic = "ptr")]
use core::sync::atomic::{AtomicPtr, Ordering};
#[cfg(target_has_atomic = "ptr")]
use core::mem;
use core::intrinsics;

#[cfg(target_has_atomic = "ptr")]
static OOM_HANDLER: AtomicPtr<()> = AtomicPtr::new(default_oom_handler as *mut ());

fn default_oom_handler() -> ! {
Expand All @@ -21,6 +24,7 @@ fn default_oom_handler() -> ! {
}

/// Common out-of-memory routine
#[cfg(target_has_atomic = "ptr")]
#[cold]
#[inline(never)]
#[unstable(feature = "oom", reason = "not a scrutinized interface",
Expand All @@ -31,10 +35,21 @@ pub fn oom() -> ! {
handler();
}

/// Common out-of-memory routine
#[cfg(not(target_has_atomic = "ptr"))]
#[cold]
#[inline(never)]
#[unstable(feature = "oom", reason = "not a scrutinized interface",
issue = "27700")]
pub fn oom() -> ! {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To help with the #[cfg] amount in this module, perhaps this could have two mod imp modules with the #[cfg] attributes and the implementation is reexported?

default_oom_handler()
}

/// Set a custom handler for out-of-memory conditions
///
/// To avoid recursive OOM failures, it is critical that the OOM handler does
/// not allocate any memory itself.
#[cfg(target_has_atomic = "ptr")]
#[unstable(feature = "oom", reason = "not a scrutinized interface",
issue = "27700")]
pub fn set_oom_handler(handler: fn() -> !) {
Expand Down