mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Auto merge of #106981 - joboet:std_remove_box_syntax, r=thomcc
Do not use box syntax in `std` See #94970 and #49733. About half of the `box` instances in `std` do not even need to allocate, the other half can simply be replaced with `Box::new`. `@rustbot` label +T-libs r? rust-lang/libs
This commit is contained in:
commit
d3322e2773
@ -238,7 +238,6 @@
|
||||
#![feature(allocator_internals)]
|
||||
#![feature(allow_internal_unsafe)]
|
||||
#![feature(allow_internal_unstable)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(c_unwind)]
|
||||
#![feature(cfg_target_thread_local)]
|
||||
#![feature(concat_idents)]
|
||||
|
@ -27,10 +27,10 @@ impl Thread {
|
||||
p: Box<dyn FnOnce()>,
|
||||
core_id: isize,
|
||||
) -> io::Result<Thread> {
|
||||
let p = Box::into_raw(box p);
|
||||
let p = Box::into_raw(Box::new(p));
|
||||
let tid = abi::spawn2(
|
||||
thread_start,
|
||||
p as usize,
|
||||
p.expose_addr(),
|
||||
abi::Priority::into(abi::NORMAL_PRIO),
|
||||
stack,
|
||||
core_id,
|
||||
|
@ -5,32 +5,23 @@
|
||||
// The this solution works like the implementation of macOS and
|
||||
// doesn't additional OS support
|
||||
|
||||
use crate::cell::Cell;
|
||||
use crate::ptr;
|
||||
use crate::mem;
|
||||
|
||||
#[thread_local]
|
||||
static DTORS: Cell<*mut List> = Cell::new(ptr::null_mut());
|
||||
|
||||
type List = Vec<(*mut u8, unsafe extern "C" fn(*mut u8))>;
|
||||
static mut DTORS: Vec<(*mut u8, unsafe extern "C" fn(*mut u8))> = Vec::new();
|
||||
|
||||
pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) {
|
||||
if DTORS.get().is_null() {
|
||||
let v: Box<List> = box Vec::new();
|
||||
DTORS.set(Box::into_raw(v));
|
||||
}
|
||||
|
||||
let list: &mut List = &mut *DTORS.get();
|
||||
let list = &mut DTORS;
|
||||
list.push((t, dtor));
|
||||
}
|
||||
|
||||
// every thread call this function to run through all possible destructors
|
||||
pub unsafe fn run_dtors() {
|
||||
let mut ptr = DTORS.replace(ptr::null_mut());
|
||||
while !ptr.is_null() {
|
||||
let list = Box::from_raw(ptr);
|
||||
for (ptr, dtor) in list.into_iter() {
|
||||
let mut list = mem::take(&mut DTORS);
|
||||
while !list.is_empty() {
|
||||
for (ptr, dtor) in list {
|
||||
dtor(ptr);
|
||||
}
|
||||
ptr = DTORS.replace(ptr::null_mut());
|
||||
list = mem::take(&mut DTORS);
|
||||
}
|
||||
}
|
||||
|
@ -5,43 +5,35 @@
|
||||
|
||||
use super::{abi, itron::task};
|
||||
use crate::cell::Cell;
|
||||
use crate::ptr;
|
||||
use crate::mem;
|
||||
|
||||
#[thread_local]
|
||||
static DTORS: Cell<*mut List> = Cell::new(ptr::null_mut());
|
||||
static REGISTERED: Cell<bool> = Cell::new(false);
|
||||
|
||||
type List = Vec<(*mut u8, unsafe extern "C" fn(*mut u8))>;
|
||||
#[thread_local]
|
||||
static mut DTORS: Vec<(*mut u8, unsafe extern "C" fn(*mut u8))> = Vec::new();
|
||||
|
||||
pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) {
|
||||
if DTORS.get().is_null() {
|
||||
if !REGISTERED.get() {
|
||||
let tid = task::current_task_id_aborting();
|
||||
let v: Box<List> = box Vec::new();
|
||||
DTORS.set(Box::into_raw(v));
|
||||
|
||||
// Register `tls_dtor` to make sure the TLS destructors are called
|
||||
// for tasks created by other means than `std::thread`
|
||||
unsafe { abi::SOLID_TLS_AddDestructor(tid as i32, tls_dtor) };
|
||||
REGISTERED.set(true);
|
||||
}
|
||||
|
||||
let list: &mut List = unsafe { &mut *DTORS.get() };
|
||||
let list = unsafe { &mut DTORS };
|
||||
list.push((t, dtor));
|
||||
}
|
||||
|
||||
pub unsafe fn run_dtors() {
|
||||
let ptr = DTORS.get();
|
||||
if !ptr.is_null() {
|
||||
// Swap the destructor list, call all registered destructors,
|
||||
// and repeat this until the list becomes permanently empty.
|
||||
while let Some(list) = Some(crate::mem::replace(unsafe { &mut *ptr }, Vec::new()))
|
||||
.filter(|list| !list.is_empty())
|
||||
{
|
||||
for (ptr, dtor) in list.into_iter() {
|
||||
unsafe { dtor(ptr) };
|
||||
}
|
||||
let mut list = mem::take(unsafe { &mut DTORS });
|
||||
while !list.is_empty() {
|
||||
for (ptr, dtor) in list {
|
||||
unsafe { dtor(ptr) };
|
||||
}
|
||||
|
||||
// Drop the destructor list
|
||||
unsafe { Box::from_raw(DTORS.replace(ptr::null_mut())) };
|
||||
list = mem::take(unsafe { &mut DTORS });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ unsafe impl Sync for Thread {}
|
||||
impl Thread {
|
||||
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||
pub unsafe fn new(stack: usize, p: Box<dyn FnOnce()>) -> io::Result<Thread> {
|
||||
let p = Box::into_raw(box p);
|
||||
let p = Box::into_raw(Box::new(p));
|
||||
let mut native: libc::pthread_t = mem::zeroed();
|
||||
let mut attr: libc::pthread_attr_t = mem::zeroed();
|
||||
assert_eq!(libc::pthread_attr_init(&mut attr), 0);
|
||||
|
@ -57,39 +57,34 @@ pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) {
|
||||
#[cfg(target_os = "macos")]
|
||||
pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) {
|
||||
use crate::cell::Cell;
|
||||
use crate::mem;
|
||||
use crate::ptr;
|
||||
|
||||
#[thread_local]
|
||||
static REGISTERED: Cell<bool> = Cell::new(false);
|
||||
|
||||
#[thread_local]
|
||||
static mut DTORS: Vec<(*mut u8, unsafe extern "C" fn(*mut u8))> = Vec::new();
|
||||
|
||||
if !REGISTERED.get() {
|
||||
_tlv_atexit(run_dtors, ptr::null_mut());
|
||||
REGISTERED.set(true);
|
||||
}
|
||||
|
||||
type List = Vec<(*mut u8, unsafe extern "C" fn(*mut u8))>;
|
||||
|
||||
#[thread_local]
|
||||
static DTORS: Cell<*mut List> = Cell::new(ptr::null_mut());
|
||||
if DTORS.get().is_null() {
|
||||
let v: Box<List> = box Vec::new();
|
||||
DTORS.set(Box::into_raw(v));
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
fn _tlv_atexit(dtor: unsafe extern "C" fn(*mut u8), arg: *mut u8);
|
||||
}
|
||||
|
||||
let list: &mut List = &mut *DTORS.get();
|
||||
let list = &mut DTORS;
|
||||
list.push((t, dtor));
|
||||
|
||||
unsafe extern "C" fn run_dtors(_: *mut u8) {
|
||||
let mut ptr = DTORS.replace(ptr::null_mut());
|
||||
while !ptr.is_null() {
|
||||
let list = Box::from_raw(ptr);
|
||||
for (ptr, dtor) in list.into_iter() {
|
||||
let mut list = mem::take(&mut DTORS);
|
||||
while !list.is_empty() {
|
||||
for (ptr, dtor) in list {
|
||||
dtor(ptr);
|
||||
}
|
||||
ptr = DTORS.replace(ptr::null_mut());
|
||||
list = mem::take(&mut DTORS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ pub struct Thread {
|
||||
impl Thread {
|
||||
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||
pub unsafe fn new(stack: usize, p: Box<dyn FnOnce()>) -> io::Result<Thread> {
|
||||
let p = Box::into_raw(box p);
|
||||
let p = Box::into_raw(Box::new(p));
|
||||
|
||||
// FIXME On UNIX, we guard against stack sizes that are too small but
|
||||
// that's because pthreads enforces that stacks are at least
|
||||
|
@ -30,7 +30,7 @@ pub unsafe fn register_dtor_fallback(t: *mut u8, dtor: unsafe extern "C" fn(*mut
|
||||
static DTORS: StaticKey = StaticKey::new(Some(run_dtors));
|
||||
type List = Vec<(*mut u8, unsafe extern "C" fn(*mut u8))>;
|
||||
if DTORS.get().is_null() {
|
||||
let v: Box<List> = box Vec::new();
|
||||
let v: Box<List> = Box::new(Vec::new());
|
||||
DTORS.set(Box::into_raw(v) as *mut u8);
|
||||
}
|
||||
let list: &mut List = &mut *(DTORS.get() as *mut List);
|
||||
|
@ -1110,8 +1110,7 @@ pub mod os {
|
||||
let ptr = if ptr.is_null() {
|
||||
// If the lookup returned null, we haven't initialized our own
|
||||
// local copy, so do that now.
|
||||
let ptr: Box<Value<T>> = box Value { inner: LazyKeyInner::new(), key: self };
|
||||
let ptr = Box::into_raw(ptr);
|
||||
let ptr = Box::into_raw(Box::new(Value { inner: LazyKeyInner::new(), key: self }));
|
||||
// SAFETY: At this point we are sure there is no value inside
|
||||
// ptr so setting it will not affect anyone else.
|
||||
unsafe {
|
||||
|
Loading…
Reference in New Issue
Block a user