diff options
| author | bors <bors@rust-lang.org> | 2016-03-26 01:13:31 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-26 01:13:31 -0700 |
| commit | d322f990b04e3b598afd6a47c09a0277f73031aa (patch) | |
| tree | aa4db313962bedd35e235ad3913408133d0e0848 /src/libstd/thread | |
| parent | 8d2d2be6c61c17da8027a72da91f87a0e2487f74 (diff) | |
| parent | 6c10866b0241b6f37f1f5e30eaed3ac316b63ea4 (diff) | |
| download | rust-d322f990b04e3b598afd6a47c09a0277f73031aa.tar.gz rust-d322f990b04e3b598afd6a47c09a0277f73031aa.zip | |
Auto merge of #32496 - Manishearth:rollup, r=Manishearth
Rollup of 11 pull requests - Successful merges: #32131, #32199, #32257, #32325, #32435, #32447, #32448, #32456, #32469, #32476, #32482 - Failed merges: #32240
Diffstat (limited to 'src/libstd/thread')
| -rw-r--r-- | src/libstd/thread/mod.rs | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs index f3139aaf98d..b3549dc1264 100644 --- a/src/libstd/thread/mod.rs +++ b/src/libstd/thread/mod.rs @@ -166,6 +166,8 @@ use any::Any; use cell::UnsafeCell; use fmt; use io; +use str; +use ffi::{CStr, CString}; use sync::{Mutex, Condvar, Arc}; use sys::thread as imp; use sys_common::thread_info; @@ -267,7 +269,7 @@ impl Builder { let their_packet = my_packet.clone(); let main = move || { - if let Some(name) = their_thread.name() { + if let Some(name) = their_thread.cname() { imp::Thread::set_name(name); } unsafe { @@ -450,7 +452,7 @@ pub fn park_timeout(dur: Duration) { /// The internal representation of a `Thread` handle struct Inner { - name: Option<String>, + name: Option<CString>, // Guaranteed to be UTF-8 lock: Mutex<bool>, // true when there is a buffered unpark cvar: Condvar, } @@ -465,9 +467,12 @@ pub struct Thread { impl Thread { // Used only internally to construct a thread object without spawning fn new(name: Option<String>) -> Thread { + let cname = name.map(|n| CString::new(n).unwrap_or_else(|_| { + panic!("thread name may not contain interior null bytes") + })); Thread { inner: Arc::new(Inner { - name: name, + name: cname, lock: Mutex::new(false), cvar: Condvar::new(), }) @@ -489,6 +494,10 @@ impl Thread { /// Gets the thread's name. #[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()) } ) + } + + fn cname(&self) -> Option<&CStr> { self.inner.name.as_ref().map(|s| &**s) } } @@ -623,6 +632,12 @@ mod tests { } #[test] + #[should_panic] + fn test_invalid_named_thread() { + let _ = Builder::new().name("ada l\0velace".to_string()).spawn(|| {}); + } + + #[test] fn test_run_basic() { let (tx, rx) = channel(); thread::spawn(move|| { |
