mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-28 20:16:58 +03:00
Auto merge of #37492 - japaric:no-atomics-alloc, r=brson
make `alloc` and `collections` compilable for thumbv6m-none-eabi by cfging away `alloc::Arc` and changing OOM to abort for this target r? @alexcrichton cc @thejpster
This commit is contained in:
@@ -74,6 +74,7 @@
|
||||
|
||||
#![feature(allocator)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(cfg_target_has_atomic)]
|
||||
#![feature(coerce_unsized)]
|
||||
#![feature(const_fn)]
|
||||
#![feature(core_intrinsics)]
|
||||
@@ -122,6 +123,7 @@ mod boxed {
|
||||
}
|
||||
#[cfg(test)]
|
||||
mod boxed_test;
|
||||
#[cfg(target_has_atomic = "ptr")]
|
||||
pub mod arc;
|
||||
pub mod rc;
|
||||
pub mod raw_vec;
|
||||
|
||||
+34
-15
@@ -8,12 +8,10 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use core::sync::atomic::{AtomicPtr, Ordering};
|
||||
use core::mem;
|
||||
#[cfg(target_has_atomic = "ptr")]
|
||||
pub use self::imp::set_oom_handler;
|
||||
use core::intrinsics;
|
||||
|
||||
static OOM_HANDLER: AtomicPtr<()> = AtomicPtr::new(default_oom_handler as *mut ());
|
||||
|
||||
fn default_oom_handler() -> ! {
|
||||
// The default handler can't do much more since we can't assume the presence
|
||||
// of libc or any way of printing an error message.
|
||||
@@ -26,17 +24,38 @@ fn default_oom_handler() -> ! {
|
||||
#[unstable(feature = "oom", reason = "not a scrutinized interface",
|
||||
issue = "27700")]
|
||||
pub fn oom() -> ! {
|
||||
let value = OOM_HANDLER.load(Ordering::SeqCst);
|
||||
let handler: fn() -> ! = unsafe { mem::transmute(value) };
|
||||
handler();
|
||||
self::imp::oom()
|
||||
}
|
||||
|
||||
/// 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.
|
||||
#[unstable(feature = "oom", reason = "not a scrutinized interface",
|
||||
issue = "27700")]
|
||||
pub fn set_oom_handler(handler: fn() -> !) {
|
||||
OOM_HANDLER.store(handler as *mut (), Ordering::SeqCst);
|
||||
#[cfg(target_has_atomic = "ptr")]
|
||||
mod imp {
|
||||
use core::mem;
|
||||
use core::sync::atomic::{AtomicPtr, Ordering};
|
||||
|
||||
static OOM_HANDLER: AtomicPtr<()> = AtomicPtr::new(super::default_oom_handler as *mut ());
|
||||
|
||||
#[inline(always)]
|
||||
pub fn oom() -> ! {
|
||||
let value = OOM_HANDLER.load(Ordering::SeqCst);
|
||||
let handler: fn() -> ! = unsafe { mem::transmute(value) };
|
||||
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.
|
||||
#[unstable(feature = "oom", reason = "not a scrutinized interface",
|
||||
issue = "27700")]
|
||||
pub fn set_oom_handler(handler: fn() -> !) {
|
||||
OOM_HANDLER.store(handler as *mut (), Ordering::SeqCst);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(target_has_atomic = "ptr"))]
|
||||
mod imp {
|
||||
#[inline(always)]
|
||||
pub fn oom() -> ! {
|
||||
super::default_oom_handler()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user