1
Fork 0

Format the world

This commit is contained in:
Mark Rousskov 2019-12-22 17:42:04 -05:00
parent 8eb7c58dbb
commit a06baa56b9
1160 changed files with 65934 additions and 74316 deletions

View file

@ -166,13 +166,13 @@ use crate::num::NonZeroU64;
use crate::panic;
use crate::panicking;
use crate::str;
use crate::sync::{Mutex, Condvar, Arc};
use crate::sync::atomic::AtomicUsize;
use crate::sync::atomic::Ordering::SeqCst;
use crate::sync::{Arc, Condvar, Mutex};
use crate::sys::thread as imp;
use crate::sys_common::mutex;
use crate::sys_common::thread_info;
use crate::sys_common::thread;
use crate::sys_common::thread_info;
use crate::sys_common::{AsInner, IntoInner};
use crate::time::Duration;
@ -180,10 +180,11 @@ use crate::time::Duration;
// Thread-local storage
////////////////////////////////////////////////////////////////////////////////
#[macro_use] mod local;
#[macro_use]
mod local;
#[stable(feature = "rust1", since = "1.0.0")]
pub use self::local::{LocalKey, AccessError};
pub use self::local::{AccessError, LocalKey};
// The types used by the thread_local! macro to access TLS keys. Note that there
// are two types, the "OS" type and the "fast" type. The OS thread local key
@ -194,14 +195,17 @@ pub use self::local::{LocalKey, AccessError};
// where fast TLS was not available; end-user code is compiled with fast TLS
// where available, but both are needed.
#[unstable(feature = "libstd_thread_internals", issue = "none")]
#[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))]
#[doc(hidden)] pub use self::local::statik::Key as __StaticLocalKeyInner;
#[unstable(feature = "libstd_thread_internals", issue = "none")]
#[cfg(target_thread_local)]
#[doc(hidden)] pub use self::local::fast::Key as __FastLocalKeyInner;
#[doc(hidden)]
pub use self::local::fast::Key as __FastLocalKeyInner;
#[unstable(feature = "libstd_thread_internals", issue = "none")]
#[doc(hidden)] pub use self::local::os::Key as __OsLocalKeyInner;
#[doc(hidden)]
pub use self::local::os::Key as __OsLocalKeyInner;
#[unstable(feature = "libstd_thread_internals", issue = "none")]
#[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))]
#[doc(hidden)]
pub use self::local::statik::Key as __StaticLocalKeyInner;
////////////////////////////////////////////////////////////////////////////////
// Builder
@ -279,10 +283,7 @@ impl Builder {
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn new() -> Builder {
Builder {
name: None,
stack_size: None,
}
Builder { name: None, stack_size: None }
}
/// Names the thread-to-be. Currently the name is used for identification
@ -376,8 +377,11 @@ impl Builder {
/// handler.join().unwrap();
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>> where
F: FnOnce() -> T, F: Send + 'static, T: Send + 'static
pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>>
where
F: FnOnce() -> T,
F: Send + 'static,
T: Send + 'static,
{
unsafe { self.spawn_unchecked(f) }
}
@ -445,8 +449,11 @@ impl Builder {
/// [`JoinHandle`]: ../../std/thread/struct.JoinHandle.html
/// [`JoinHandle::join`]: ../../std/thread/struct.JoinHandle.html#method.join
#[unstable(feature = "thread_spawn_unchecked", issue = "55132")]
pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> io::Result<JoinHandle<T>> where
F: FnOnce() -> T, F: Send + 'a, T: Send + 'a
pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> io::Result<JoinHandle<T>>
where
F: FnOnce() -> T,
F: Send + 'a,
T: Send + 'a,
{
let Builder { name, stack_size } = self;
@ -455,8 +462,7 @@ impl Builder {
let my_thread = Thread::new(name);
let their_thread = my_thread.clone();
let my_packet : Arc<UnsafeCell<Option<Result<T>>>>
= Arc::new(UnsafeCell::new(None));
let my_packet: Arc<UnsafeCell<Option<Result<T>>>> = Arc::new(UnsafeCell::new(None));
let their_packet = my_packet.clone();
let main = move || {
@ -604,8 +610,11 @@ impl Builder {
/// [`Send`]: ../../std/marker/trait.Send.html
/// [`Sync`]: ../../std/marker/trait.Sync.html
#[stable(feature = "rust1", since = "1.0.0")]
pub fn spawn<F, T>(f: F) -> JoinHandle<T> where
F: FnOnce() -> T, F: Send + 'static, T: Send + 'static
pub fn spawn<F, T>(f: F) -> JoinHandle<T>
where
F: FnOnce() -> T,
F: Send + 'static,
T: Send + 'static,
{
Builder::new().spawn(f).expect("failed to spawn thread")
}
@ -631,9 +640,11 @@ pub fn spawn<F, T>(f: F) -> JoinHandle<T> where
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn current() -> Thread {
thread_info::current_thread().expect("use of std::thread::current() is not \
thread_info::current_thread().expect(
"use of std::thread::current() is not \
possible after the thread's local \
data has been destroyed")
data has been destroyed",
)
}
/// Cooperatively gives up a timeslice to the OS scheduler.
@ -884,7 +895,7 @@ pub fn park() {
// If we were previously notified then we consume this notification and
// return quickly.
if thread.inner.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst).is_ok() {
return
return;
}
// Otherwise we need to coordinate going to sleep
@ -908,7 +919,7 @@ pub fn park() {
m = thread.inner.cvar.wait(m).unwrap();
match thread.inner.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst) {
Ok(_) => return, // got a notification
Err(_) => {} // spurious wakeup, go back to sleep
Err(_) => {} // spurious wakeup, go back to sleep
}
}
}
@ -982,7 +993,7 @@ pub fn park_timeout(dur: Duration) {
// afterwards we start coordinating for a sleep.
// return quickly.
if thread.inner.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst).is_ok() {
return
return;
}
let m = thread.inner.lock.lock().unwrap();
match thread.inner.state.compare_exchange(EMPTY, PARKED, SeqCst, SeqCst) {
@ -1003,7 +1014,7 @@ pub fn park_timeout(dur: Duration) {
let (_m, _result) = thread.inner.cvar.wait_timeout(m, dur).unwrap();
match thread.inner.state.swap(EMPTY, SeqCst) {
NOTIFIED => {} // got a notification, hurray!
PARKED => {} // no notification, alas
PARKED => {} // no notification, alas
n => panic!("inconsistent park_timeout state: {}", n),
}
}
@ -1069,7 +1080,7 @@ impl ThreadId {
/// The internal representation of a `Thread` handle
struct Inner {
name: Option<CString>, // Guaranteed to be UTF-8
name: Option<CString>, // Guaranteed to be UTF-8
id: ThreadId,
// state for thread park/unpark
@ -1111,9 +1122,8 @@ impl Thread {
// Used only internally to construct a thread object without spawning
// Panics if the name contains nuls.
pub(crate) fn new(name: Option<String>) -> Thread {
let cname = name.map(|n| {
CString::new(n).expect("thread name may not contain interior null bytes")
});
let cname =
name.map(|n| CString::new(n).expect("thread name may not contain interior null bytes"));
Thread {
inner: Arc::new(Inner {
name: cname,
@ -1121,7 +1131,7 @@ impl Thread {
state: AtomicUsize::new(EMPTY),
lock: Mutex::new(()),
cvar: Condvar::new(),
})
}),
}
}
@ -1166,9 +1176,9 @@ impl Thread {
// rather than a compare-and-swap that returns if it reads `NOTIFIED`
// on failure.
match self.inner.state.swap(NOTIFIED, SeqCst) {
EMPTY => return, // no one was waiting
EMPTY => return, // no one was waiting
NOTIFIED => return, // already unparked
PARKED => {} // gotta go wake someone up
PARKED => {} // gotta go wake someone up
_ => panic!("inconsistent state in unpark"),
}
@ -1245,7 +1255,7 @@ impl Thread {
/// [naming-threads]: ./index.html#naming-threads
#[stable(feature = "rust1", since = "1.0.0")]
pub fn name(&self) -> Option<&str> {
self.cname().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) } )
self.cname().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) })
}
fn cname(&self) -> Option<&CStr> {
@ -1256,10 +1266,7 @@ impl Thread {
#[stable(feature = "rust1", since = "1.0.0")]
impl fmt::Debug for Thread {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Thread")
.field("id", &self.id())
.field("name", &self.name())
.finish()
f.debug_struct("Thread").field("id", &self.id()).field("name", &self.name()).finish()
}
}
@ -1334,9 +1341,7 @@ struct JoinInner<T> {
impl<T> JoinInner<T> {
fn join(&mut self) -> Result<T> {
self.native.take().unwrap().join();
unsafe {
(*self.packet.0.get()).take().unwrap()
}
unsafe { (*self.packet.0.get()).take().unwrap() }
}
}
@ -1471,11 +1476,15 @@ impl<T> JoinHandle<T> {
}
impl<T> AsInner<imp::Thread> for JoinHandle<T> {
fn as_inner(&self) -> &imp::Thread { self.0.native.as_ref().unwrap() }
fn as_inner(&self) -> &imp::Thread {
self.0.native.as_ref().unwrap()
}
}
impl<T> IntoInner<imp::Thread> for JoinHandle<T> {
fn into_inner(self) -> imp::Thread { self.0.native.unwrap() }
fn into_inner(self) -> imp::Thread {
self.0.native.unwrap()
}
}
#[stable(feature = "std_debug", since = "1.16.0")]
@ -1500,8 +1509,8 @@ mod tests {
use super::Builder;
use crate::any::Any;
use crate::mem;
use crate::sync::mpsc::{channel, Sender};
use crate::result;
use crate::sync::mpsc::{channel, Sender};
use crate::thread::{self, ThreadId};
use crate::time::Duration;
use crate::u32;
@ -1511,16 +1520,24 @@ mod tests {
#[test]
fn test_unnamed_thread() {
thread::spawn(move|| {
thread::spawn(move || {
assert!(thread::current().name().is_none());
}).join().ok().expect("thread panicked");
})
.join()
.ok()
.expect("thread panicked");
}
#[test]
fn test_named_thread() {
Builder::new().name("ada lovelace".to_string()).spawn(move|| {
assert!(thread::current().name().unwrap() == "ada lovelace".to_string());
}).unwrap().join().unwrap();
Builder::new()
.name("ada lovelace".to_string())
.spawn(move || {
assert!(thread::current().name().unwrap() == "ada lovelace".to_string());
})
.unwrap()
.join()
.unwrap();
}
#[test]
@ -1532,7 +1549,7 @@ mod tests {
#[test]
fn test_run_basic() {
let (tx, rx) = channel();
thread::spawn(move|| {
thread::spawn(move || {
tx.send(()).unwrap();
});
rx.recv().unwrap();
@ -1540,11 +1557,9 @@ mod tests {
#[test]
fn test_join_panic() {
match thread::spawn(move|| {
panic!()
}).join() {
match thread::spawn(move || panic!()).join() {
result::Result::Err(_) => (),
result::Result::Ok(()) => panic!()
result::Result::Ok(()) => panic!(),
}
}
@ -1554,14 +1569,13 @@ mod tests {
fn f(i: i32, tx: Sender<()>) {
let tx = tx.clone();
thread::spawn(move|| {
thread::spawn(move || {
if i == 0 {
tx.send(()).unwrap();
} else {
f(i - 1, tx);
}
});
}
f(10, tx);
rx.recv().unwrap();
@ -1571,8 +1585,8 @@ mod tests {
fn test_spawn_sched_childs_on_default_sched() {
let (tx, rx) = channel();
thread::spawn(move|| {
thread::spawn(move|| {
thread::spawn(move || {
thread::spawn(move || {
tx.send(()).unwrap();
});
});
@ -1580,13 +1594,16 @@ mod tests {
rx.recv().unwrap();
}
fn avoid_copying_the_body<F>(spawnfn: F) where F: FnOnce(Box<dyn Fn() + Send>) {
fn avoid_copying_the_body<F>(spawnfn: F)
where
F: FnOnce(Box<dyn Fn() + Send>),
{
let (tx, rx) = channel();
let x: Box<_> = box 1;
let x_in_parent = (&*x) as *const i32 as usize;
spawnfn(Box::new(move|| {
spawnfn(Box::new(move || {
let x_in_child = (&*x) as *const i32 as usize;
tx.send(x_in_child).unwrap();
}));
@ -1605,7 +1622,7 @@ mod tests {
#[test]
fn test_avoid_copying_the_body_thread_spawn() {
avoid_copying_the_body(|f| {
thread::spawn(move|| {
thread::spawn(move || {
f();
});
})
@ -1614,9 +1631,7 @@ mod tests {
#[test]
fn test_avoid_copying_the_body_join() {
avoid_copying_the_body(|f| {
let _ = thread::spawn(move|| {
f()
}).join();
let _ = thread::spawn(move || f()).join();
})
}
@ -1628,9 +1643,9 @@ mod tests {
// valgrind-friendly. try this at home, instead..!)
const GENERATIONS: u32 = 16;
fn child_no(x: u32) -> Box<dyn Fn() + Send> {
return Box::new(move|| {
return Box::new(move || {
if x < GENERATIONS {
thread::spawn(move|| child_no(x+1)());
thread::spawn(move || child_no(x + 1)());
}
});
}
@ -1644,37 +1659,43 @@ mod tests {
#[test]
fn test_try_panic_message_static_str() {
match thread::spawn(move|| {
match thread::spawn(move || {
panic!("static string");
}).join() {
})
.join()
{
Err(e) => {
type T = &'static str;
assert!(e.is::<T>());
assert_eq!(*e.downcast::<T>().unwrap(), "static string");
}
Ok(()) => panic!()
Ok(()) => panic!(),
}
}
#[test]
fn test_try_panic_message_owned_str() {
match thread::spawn(move|| {
match thread::spawn(move || {
panic!("owned string".to_string());
}).join() {
})
.join()
{
Err(e) => {
type T = String;
assert!(e.is::<T>());
assert_eq!(*e.downcast::<T>().unwrap(), "owned string".to_string());
}
Ok(()) => panic!()
Ok(()) => panic!(),
}
}
#[test]
fn test_try_panic_message_any() {
match thread::spawn(move|| {
match thread::spawn(move || {
panic!(box 413u16 as Box<dyn Any + Send>);
}).join() {
})
.join()
{
Err(e) => {
type T = Box<dyn Any + Send>;
assert!(e.is::<T>());
@ -1682,7 +1703,7 @@ mod tests {
assert!(any.is::<u16>());
assert_eq!(*any.downcast::<u16>().unwrap(), 413);
}
Ok(()) => panic!()
Ok(()) => panic!(),
}
}
@ -1690,11 +1711,9 @@ mod tests {
fn test_try_panic_message_unit_struct() {
struct Juju;
match thread::spawn(move|| {
panic!(Juju)
}).join() {
match thread::spawn(move || panic!(Juju)).join() {
Err(ref e) if e.is::<Juju>() => {}
Err(_) | Ok(()) => panic!()
Err(_) | Ok(()) => panic!(),
}
}