]> git.lizzy.rs Git - rust.git/commitdiff
Fallout from stabilization
authorAaron Turon <aturon@mozilla.com>
Tue, 6 Jan 2015 05:59:45 +0000 (21:59 -0800)
committerAaron Turon <aturon@mozilla.com>
Tue, 6 Jan 2015 22:57:52 +0000 (14:57 -0800)
97 files changed:
src/compiletest/runtest.rs
src/doc/intro.md
src/liballoc/arc.rs
src/libcollections/dlist.rs
src/libcore/atomic.rs
src/librustc_driver/lib.rs
src/librustc_trans/back/write.rs
src/librustdoc/lib.rs
src/librustdoc/test.rs
src/libstd/io/comm_adapters.rs
src/libstd/io/mod.rs
src/libstd/io/net/pipe.rs
src/libstd/io/net/tcp.rs
src/libstd/io/process.rs
src/libstd/io/timer.rs
src/libstd/macros.rs
src/libstd/path/posix.rs
src/libstd/path/windows.rs
src/libstd/rand/os.rs
src/libstd/sync/barrier.rs
src/libstd/sync/condvar.rs
src/libstd/sync/future.rs
src/libstd/sync/mpsc/mod.rs
src/libstd/sync/mpsc/mpsc_queue.rs
src/libstd/sync/mutex.rs
src/libstd/sync/once.rs
src/libstd/sync/rwlock.rs
src/libstd/sync/semaphore.rs
src/libstd/sync/task_pool.rs
src/libstd/sys/common/helper_thread.rs
src/libstd/thread.rs
src/libstd/thread_local/mod.rs
src/libtest/lib.rs
src/test/auxiliary/cci_capture_clause.rs
src/test/bench/msgsend-pipes-shared.rs
src/test/bench/msgsend-pipes.rs
src/test/bench/rt-messaging-ping-pong.rs
src/test/bench/rt-parfib.rs
src/test/bench/shootout-binarytrees.rs
src/test/bench/shootout-chameneos-redux.rs
src/test/bench/shootout-fannkuch-redux.rs
src/test/bench/shootout-k-nucleotide-pipes.rs
src/test/bench/shootout-k-nucleotide.rs
src/test/bench/shootout-mandelbrot.rs
src/test/bench/shootout-meteor.rs
src/test/bench/shootout-pfib.rs
src/test/bench/shootout-threadring.rs
src/test/bench/task-perf-alloc-unwind.rs
src/test/bench/task-perf-jargon-metal-smoke.rs
src/test/bench/task-perf-spawnalot.rs
src/test/run-fail/panic-task-name-none.rs
src/test/run-fail/panic-task-name-owned.rs
src/test/run-fail/task-spawn-barefn.rs
src/test/run-make/static-unwinding/main.rs
src/test/run-pass/cleanup-rvalue-temp-during-incomplete-alloc.rs
src/test/run-pass/core-run-destroy.rs
src/test/run-pass/foreign-call-no-runtime.rs
src/test/run-pass/hashmap-memory.rs
src/test/run-pass/issue-12684.rs
src/test/run-pass/issue-13494.rs
src/test/run-pass/issue-16560.rs
src/test/run-pass/issue-16671.rs
src/test/run-pass/issue-2190-1.rs
src/test/run-pass/issue-4446.rs
src/test/run-pass/issue-4448.rs
src/test/run-pass/issue-8460.rs
src/test/run-pass/issue-8827.rs
src/test/run-pass/logging-only-prints-once.rs
src/test/run-pass/macro-with-braces-in-expr-position.rs
src/test/run-pass/no-landing-pads.rs
src/test/run-pass/panic-in-dtor-drops-fields.rs
src/test/run-pass/sendfn-spawn-with-fn-arg.rs
src/test/run-pass/sepcomp-unwind.rs
src/test/run-pass/slice-panic-1.rs
src/test/run-pass/slice-panic-2.rs
src/test/run-pass/spawn-types.rs
src/test/run-pass/spawn.rs
src/test/run-pass/spawn2.rs
src/test/run-pass/spawning-with-debug.rs
src/test/run-pass/task-comm-1.rs
src/test/run-pass/task-comm-12.rs
src/test/run-pass/task-comm-13.rs
src/test/run-pass/task-comm-14.rs
src/test/run-pass/task-comm-17.rs
src/test/run-pass/task-comm-3.rs
src/test/run-pass/task-comm-9.rs
src/test/run-pass/task-stderr.rs
src/test/run-pass/tcp-accept-stress.rs
src/test/run-pass/tcp-stress.rs
src/test/run-pass/tempfile.rs
src/test/run-pass/terminate-in-initializer.rs
src/test/run-pass/threads.rs
src/test/run-pass/unique-send-2.rs
src/test/run-pass/unit-like-struct-drop-run.rs
src/test/run-pass/vector-sort-panic-safe.rs
src/test/run-pass/yield.rs
src/test/run-pass/yield1.rs

index 875061e69b7a28ce49bfc6c8070dbd5bb6f4c619..18d90dab51a8860bcb77be577fc26ef671912006 100644 (file)
@@ -447,7 +447,7 @@ fn run_debuginfo_gdb_test(config: &Config, props: &TestProps, testfile: &Path) {
             loop {
                 //waiting 1 second for gdbserver start
                 timer::sleep(Duration::milliseconds(1000));
-                let result = Thread::spawn(move || {
+                let result = Thread::scoped(move || {
                     tcp::TcpStream::connect("127.0.0.1:5039").unwrap();
                 }).join();
                 if result.is_err() {
index a4e9d85bffdf8eb203e0de8dc2f0319b06e1b130..fbc96a577a41acc43c237f2d951c53869ff8d544 100644 (file)
@@ -395,7 +395,7 @@ fn main() {
     for _ in range(0u, 10u) {
         Thread::spawn(move || {
             println!("Hello, world!");
-        }).detach();
+        });
     }
 }
 ```
@@ -405,8 +405,7 @@ This program creates ten threads, who all print `Hello, world!`. The
 double bars `||`. (The `move` keyword indicates that the closure takes
 ownership of any data it uses; we'll have more on the significance of
 this shortly.) This closure is executed in a new thread created by
-`spawn`. The `detach` method means that the child thread is allowed to
-outlive its parent.
+`spawn`.
 
 One common form of problem in concurrent programs is a 'data race.'
 This occurs when two different threads attempt to access the same
@@ -429,7 +428,7 @@ fn main() {
     for i in range(0u, 3u) {
         Thread::spawn(move || {
             for j in range(0, 3) { numbers[j] += 1 }
-        }).detach();
+        });
     }
 }
 ```
@@ -488,7 +487,7 @@ fn main() {
             (*array)[i] += 1;
 
             println!("numbers[{}] is {}", i, (*array)[i]);
-        }).detach();
+        });
     }
 }
 ```
index 25f80ad11bd1124b87ef34445b799b4dd67f80cf..ac3d2b002123c08ef4f3b20e021c8ae67ddfd0ca 100644 (file)
@@ -42,7 +42,7 @@
 //!
 //!     Thread::spawn(move || {
 //!         println!("{}", five);
-//!     }).detach();
+//!     });
 //! }
 //! ```
 //!
@@ -63,7 +63,7 @@
 //!         *number += 1;
 //!
 //!         println!("{}", *number); // prints 6
-//!     }).detach();
+//!     });
 //! }
 //! ```
 
 ///             let local_numbers = child_numbers.as_slice();
 ///
 ///             // Work with the local numbers
-///         }).detach();
+///         });
 ///     }
 /// }
 /// ```
index 5e08f90ce1c536368aef61df7e5577e675932a1e..d628bdc364364a23d7fc914875a23ac13d2489b5 100644 (file)
@@ -924,7 +924,7 @@ fn test_mut_rev_iter() {
     #[test]
     fn test_send() {
         let n = list_from(&[1i,2,3]);
-        Thread::spawn(move || {
+        Thread::scoped(move || {
             check_links(&n);
             let a: &[_] = &[&1,&2,&3];
             assert_eq!(a, n.iter().collect::<Vec<&int>>());
index 15c20253c8bc78b1c739b28c14215e9484886455..cc4308b52942085828769ba64e3f64342f5ccbc9 100644 (file)
@@ -50,7 +50,7 @@
 //!     let spinlock_clone = spinlock.clone();
 //!     Thread::spawn(move|| {
 //!         spinlock_clone.store(0, Ordering::SeqCst);
-//!     }).detach();
+//!     });
 //!
 //!     // Wait for the other task to release the lock
 //!     while spinlock.load(Ordering::SeqCst) != 0 {}
index 89b2e0f257acd97b5ca75a1b0c2b393e0f7e84dc..ef78da3fd0e9773758565d5624dba1cbef16e381 100644 (file)
@@ -559,7 +559,7 @@ pub fn monitor<F:FnOnce()+Send>(f: F) {
         cfg = cfg.stack_size(STACK_SIZE);
     }
 
-    match cfg.spawn(move || { std::io::stdio::set_stderr(box w); f() }).join() {
+    match cfg.scoped(move || { std::io::stdio::set_stderr(box w); f() }).join() {
         Ok(()) => { /* fallthrough */ }
         Err(value) => {
             // Thread panicked without emitting a fatal diagnostic
index 98e2b4b9dddb575bbba99fe53160840f43c7d138..aa82950257e7c66c69daa52866c3fe81fd09308a 100644 (file)
@@ -928,7 +928,7 @@ fn run_work_multithreaded(sess: &Session,
             }
 
             tx.take().unwrap().send(()).unwrap();
-        }).detach();
+        });
     }
 
     let mut panicked = false;
index 6e42c50f974c51f2a4748db95d47c78a2ddf9fbe..c3a5a9e6dc9d7e31ba7273491c0aa7ffb74da067 100644 (file)
@@ -116,7 +116,7 @@ struct Output {
 
 pub fn main() {
     static STACK_SIZE: uint = 32000000; // 32MB
-    let res = std::thread::Builder::new().stack_size(STACK_SIZE).spawn(move || {
+    let res = std::thread::Builder::new().stack_size(STACK_SIZE).scoped(move || {
         main_args(std::os::args().as_slice())
     }).join();
     std::os::set_exit_status(res.map_err(|_| ()).unwrap());
@@ -358,7 +358,7 @@ fn rust_input(cratefile: &str, externs: core::Externs, matches: &getopts::Matche
     let cr = Path::new(cratefile);
     info!("starting to run rustc");
 
-    let (mut krate, analysis) = std::thread::Thread::spawn(move |:| {
+    let (mut krate, analysis) = std::thread::Thread::scoped(move |:| {
         let cr = cr;
         core::run_core(paths, cfgs, externs, &cr, triple)
     }).join().map_err(|_| "rustc failed").unwrap();
index bded371e5002d2858f15a1a7431f92a4bd436fc2..278260fd3e6b7ae8a0f26d5c26dff8ccd0753e1f 100644 (file)
@@ -157,7 +157,7 @@ fn runtest(test: &str, cratename: &str, libs: SearchPaths,
             None => box io::stderr() as Box<Writer>,
         };
         io::util::copy(&mut p, &mut err).unwrap();
-    }).detach();
+    });
     let emitter = diagnostic::EmitterWriter::new(box w2, None);
 
     // Compile the code
index f47f6237b72910e46568e246a5c8a2175b729d07..9ccede09cfc94d6ae03edec32a373260ae0b526e 100644 (file)
@@ -172,7 +172,7 @@ fn test_rx_reader() {
           tx.send(vec![3u8, 4u8]).unwrap();
           tx.send(vec![5u8, 6u8]).unwrap();
           tx.send(vec![7u8, 8u8]).unwrap();
-        }).detach();
+        });
 
         let mut reader = ChanReader::new(rx);
         let mut buf = [0u8; 3];
@@ -215,7 +215,7 @@ fn test_rx_buffer() {
           tx.send(b"rld\nhow ".to_vec()).unwrap();
           tx.send(b"are you?".to_vec()).unwrap();
           tx.send(b"".to_vec()).unwrap();
-        }).detach();
+        });
 
         let mut reader = ChanReader::new(rx);
 
@@ -234,7 +234,7 @@ fn test_chan_writer() {
         writer.write_be_u32(42).unwrap();
 
         let wanted = vec![0u8, 0u8, 0u8, 42u8];
-        let got = match Thread::spawn(move|| { rx.recv().unwrap() }).join() {
+        let got = match Thread::scoped(move|| { rx.recv().unwrap() }).join() {
             Ok(got) => got,
             Err(_) => panic!(),
         };
index 5bef473db990c8879a7fcb23d801ad6a88321769..46c59ec49c19055ee18aaa4ea4deec094ca9b429 100644 (file)
 //!     for stream in acceptor.incoming() {
 //!         match stream {
 //!             Err(e) => { /* connection failed */ }
-//!             Ok(stream) => Thread::spawn(move|| {
-//!                 // connection succeeded
-//!                 handle_client(stream)
-//!             }).detach()
+//!             Ok(stream) => {
+//!                 Thread::spawn(move|| {
+//!                     // connection succeeded
+//!                     handle_client(stream)
+//!                 });
+//!             }
 //!         }
 //!     }
 //!
index 738c70412f78a0aa3def5993a313879ecdeed747..29295b5751cd4c92aec5c684ac8b8106d057a9d6 100644 (file)
@@ -608,7 +608,7 @@ fn close_readwrite_smoke() {
             let mut a = a;
             let _s = a.accept().unwrap();
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut b = [0];
         let mut s = UnixStream::connect(&addr).unwrap();
@@ -645,7 +645,7 @@ fn close_read_wakes_up() {
             let mut a = a;
             let _s = a.accept().unwrap();
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = UnixStream::connect(&addr).unwrap();
         let s2 = s.clone();
@@ -672,7 +672,7 @@ fn readwrite_timeouts() {
             rx.recv().unwrap();
             assert!(s.write(&[0]).is_ok());
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         s.set_timeout(Some(20));
@@ -716,7 +716,7 @@ fn read_timeouts() {
                 }
             }
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         s.set_read_timeout(Some(20));
@@ -739,7 +739,7 @@ fn write_timeouts() {
             rx.recv().unwrap();
             assert!(s.write(&[0]).is_ok());
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         s.set_write_timeout(Some(20));
@@ -766,7 +766,7 @@ fn timeout_concurrent_read() {
             rx.recv().unwrap();
             assert!(s.write(&[0]).is_ok());
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         let s2 = s.clone();
index 3e59aaa05efd285d8b7f5f3af68273e0d6ac5f37..b1762ff26fc6a9faf2bec7403568edf68597c96f 100644 (file)
@@ -146,7 +146,7 @@ pub fn set_keepalive(&mut self, delay_in_seconds: Option<uint>) -> IoResult<()>
     ///     timer::sleep(Duration::seconds(1));
     ///     let mut stream = stream2;
     ///     stream.close_read();
-    /// }).detach();
+    /// });
     ///
     /// // wait for some data, will get canceled after one second
     /// let mut buf = [0];
@@ -295,10 +295,12 @@ fn as_inner(&self) -> &TcpStreamImp {
 /// for stream in acceptor.incoming() {
 ///     match stream {
 ///         Err(e) => { /* connection failed */ }
-///         Ok(stream) => Thread::spawn(move|| {
-///             // connection succeeded
-///             handle_client(stream)
-///         }).detach()
+///         Ok(stream) => {
+///             Thread::spawn(move|| {
+///                 // connection succeeded
+///                 handle_client(stream)
+///             });
+///         }
 ///     }
 /// }
 ///
@@ -432,7 +434,7 @@ impl TcpAcceptor {
     ///             Err(e) => panic!("unexpected error: {}", e),
     ///         }
     ///     }
-    /// }).detach();
+    /// });
     ///
     /// # fn wait_for_sigint() {}
     /// // Now that our accept loop is running, wait for the program to be
@@ -1186,7 +1188,7 @@ fn close_readwrite_smoke() {
             let mut a = a;
             let _s = a.accept().unwrap();
             let _ = rx.recv().unwrap();
-        }).detach();
+        });
 
         let mut b = [0];
         let mut s = TcpStream::connect(addr).unwrap();
@@ -1223,7 +1225,7 @@ fn close_read_wakes_up() {
             let mut a = a;
             let _s = a.accept().unwrap();
             let _ = rx.recv().unwrap();
-        }).detach();
+        });
 
         let mut s = TcpStream::connect(addr).unwrap();
         let s2 = s.clone();
@@ -1250,7 +1252,7 @@ fn readwrite_timeouts() {
             rx.recv().unwrap();
             assert!(s.write(&[0]).is_ok());
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         s.set_timeout(Some(20));
@@ -1289,7 +1291,7 @@ fn read_timeouts() {
                 }
             }
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         s.set_read_timeout(Some(20));
@@ -1312,7 +1314,7 @@ fn write_timeouts() {
             rx.recv().unwrap();
             assert!(s.write(&[0]).is_ok());
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         s.set_write_timeout(Some(20));
@@ -1340,7 +1342,7 @@ fn timeout_concurrent_read() {
             rx.recv().unwrap();
             assert_eq!(s.write(&[0]), Ok(()));
             let _ = rx.recv();
-        }).detach();
+        });
 
         let mut s = a.accept().unwrap();
         let s2 = s.clone();
index ea232ad0c3f1b0876b1d860fb1dd1447397b7d1f..d7452180ffa6466aeca440cd924bcfaa602bd3f8 100644 (file)
@@ -705,7 +705,7 @@ fn read(stream: Option<io::PipeStream>) -> Receiver<IoResult<Vec<u8>>> {
                     Thread::spawn(move |:| {
                         let mut stream = stream;
                         tx.send(stream.read_to_end()).unwrap();
-                    }).detach();
+                    });
                 }
                 None => tx.send(Ok(Vec::new())).unwrap()
             }
index e073f76af825ce77628696d262a99af136589f6b..8a0445be47135775ba1483c0371457c231785eed 100644 (file)
@@ -358,7 +358,7 @@ fn closing_channel_during_drop_doesnt_kill_everything() {
 
         Thread::spawn(move|| {
             let _ = timer_rx.recv();
-        }).detach();
+        });
 
         // when we drop the TimerWatcher we're going to destroy the channel,
         // which must wake up the task on the other end
@@ -372,7 +372,7 @@ fn reset_doesnt_switch_tasks() {
 
         Thread::spawn(move|| {
             let _ = timer_rx.recv();
-        }).detach();
+        });
 
         timer.oneshot(Duration::milliseconds(1));
     }
@@ -385,7 +385,7 @@ fn reset_doesnt_switch_tasks2() {
 
         Thread::spawn(move|| {
             let _ = timer_rx.recv();
-        }).detach();
+        });
 
         timer.sleep(Duration::milliseconds(1));
     }
index d96441e09a813efa82ee5c66384c11074d90416c..092430bf082d3fa6b703ee39253dca41ba06b563 100644 (file)
@@ -303,8 +303,8 @@ macro_rules! try {
 /// # fn long_running_task() {}
 /// # fn calculate_the_answer() -> int { 42i }
 ///
-/// Thread::spawn(move|| { long_running_task(); tx1.send(()) }).detach();
-/// Thread::spawn(move|| { tx2.send(calculate_the_answer()) }).detach();
+/// Thread::spawn(move|| { long_running_task(); tx1.send(()).unwrap(); });
+/// Thread::spawn(move|| { tx2.send(calculate_the_answer()).unwrap(); });
 ///
 /// select! (
 ///     _ = rx1.recv() => println!("the long running task finished first"),
index d9981ace0301ec52b40ae8453951b392fe99df2d..ece9a343841231f757e5e0fc8e8063570c2f478c 100644 (file)
@@ -502,17 +502,17 @@ fn test_opt_paths() {
     #[test]
     fn test_null_byte() {
         use thread::Thread;
-        let result = Thread::spawn(move|| {
+        let result = Thread::scoped(move|| {
             Path::new(b"foo/bar\0")
         }).join();
         assert!(result.is_err());
 
-        let result = Thread::spawn(move|| {
+        let result = Thread::scoped(move|| {
             Path::new("test").set_filename(b"f\0o")
         }).join();
         assert!(result.is_err());
 
-        let result = Thread::spawn(move|| {
+        let result = Thread::scoped(move|| {
             Path::new("test").push(b"f\0o");
         }).join();
         assert!(result.is_err());
index 4b5d793355b60137fabd2b321f25efb458076cb0..db3224e66e4130d592ecc6724e9b07f7982493a4 100644 (file)
@@ -1287,17 +1287,17 @@ fn test_opt_paths() {
     #[test]
     fn test_null_byte() {
         use thread::Thread;
-        let result = Thread::spawn(move|| {
+        let result = Thread::scoped(move|| {
             Path::new(b"foo/bar\0")
         }).join();
         assert!(result.is_err());
 
-        let result = Thread::spawn(move|| {
+        let result = Thread::scoped(move|| {
             Path::new("test").set_filename(b"f\0o")
         }).join();
         assert!(result.is_err());
 
-        let result = Thread::spawn(move || {
+        let result = Thread::scoped(move || {
             Path::new("test").push(b"f\0o");
         }).join();
         assert!(result.is_err());
index a79a6e35ebcfd377ff74265cba1a9ec9d842d149..d9c019e3aced8a400dee3fffe21097089092e0c8 100644 (file)
@@ -397,7 +397,7 @@ fn test_os_rng_tasks() {
                     r.fill_bytes(&mut v);
                     Thread::yield_now();
                 }
-            }).detach();
+            });
         }
 
         // start all the tasks
index bf5da3e7cbae018b18381d6899fd894fcee6a379..709398794003869abb034616fdc6fa793d98b64b 100644 (file)
@@ -26,7 +26,7 @@
 ///         println!("before wait");
 ///         c.wait();
 ///         println!("after wait");
-///     }).detach();
+///     });
 /// }
 /// ```
 #[stable]
@@ -126,7 +126,7 @@ fn test_barrier() {
             let tx = tx.clone();
             Thread::spawn(move|| {
                 tx.send(c.wait().is_leader()).unwrap();
-            }).detach();
+            });
         }
 
         // At this point, all spawned tasks should be blocked,
index e97be51fdbc25af6ccc56aec377ee00aee43173a..3c0ae71255dbe39632a8485ee04836e793bf832d 100644 (file)
@@ -48,7 +48,7 @@
 ///     let mut started = lock.lock().unwrap();
 ///     *started = true;
 ///     cvar.notify_one();
-/// }).detach();
+/// });
 ///
 /// // wait for the thread to start up
 /// let &(ref lock, ref cvar) = &*pair;
@@ -338,7 +338,7 @@ fn notify_all() {
                     cnt = cond.wait(cnt).unwrap();
                 }
                 tx.send(()).unwrap();
-            }).detach();
+            });
         }
         drop(tx);
 
index 4c6adcc04f67cc33da0b404aa97a7d46eb4e9a56..568c24446e7a34d9c9059fa302689054913ce221 100644 (file)
@@ -141,7 +141,7 @@ pub fn spawn<F>(blk: F) -> Future<A>
         Thread::spawn(move |:| {
             // Don't panic if the other end has hung up
             let _ = tx.send(blk());
-        }).detach();
+        });
 
         Future::from_receiver(rx)
     }
index 7c18b8a43faad827cbff96a4f577e61d2b8fc19a..72c453f7f71c29bf94dcf6dea0a1d08eb0f12a3c 100644 (file)
@@ -60,7 +60,7 @@
 //! let (tx, rx) = channel();
 //! Thread::spawn(move|| {
 //!     tx.send(10i).unwrap();
-//! }).detach();
+//! });
 //! assert_eq!(rx.recv().unwrap(), 10i);
 //! ```
 //!
@@ -78,7 +78,7 @@
 //!     let tx = tx.clone();
 //!     Thread::spawn(move|| {
 //!         tx.send(i).unwrap();
-//!     }).detach()
+//!     });
 //! }
 //!
 //! for _ in range(0i, 10i) {
 //! Thread::spawn(move|| {
 //!     // This will wait for the parent task to start receiving
 //!     tx.send(53).unwrap();
-//! }).detach();
+//! });
 //! rx.recv().unwrap();
 //! ```
 //!
@@ -476,7 +476,7 @@ fn inner_unsafe<'a>(&'a self) -> &'a UnsafeCell<Flavor<T>> {
 /// Thread::spawn(move|| {
 /// #   fn expensive_computation() {}
 ///     tx.send(expensive_computation()).unwrap();
-/// }).detach();
+/// });
 ///
 /// // Do some useful work for awhile
 ///
@@ -518,7 +518,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
 /// Thread::spawn(move|| {
 ///     // this will block until the previous message has been received
 ///     tx.send(2i).unwrap();
-/// }).detach();
+/// });
 ///
 /// assert_eq!(rx.recv().unwrap(), 1i);
 /// assert_eq!(rx.recv().unwrap(), 2i);
@@ -1144,7 +1144,7 @@ fn chan_gone_concurrent() {
     #[test]
     fn stress() {
         let (tx, rx) = channel::<int>();
-        let t = Thread::spawn(move|| {
+        let t = Thread::scoped(move|| {
             for _ in range(0u, 10000) { tx.send(1i).unwrap(); }
         });
         for _ in range(0u, 10000) {
@@ -1159,7 +1159,7 @@ fn stress_shared() {
         static NTHREADS: uint = 8;
         let (tx, rx) = channel::<int>();
 
-        let t = Thread::spawn(move|| {
+        let t = Thread::scoped(move|| {
             for _ in range(0, AMT * NTHREADS) {
                 assert_eq!(rx.recv().unwrap(), 1);
             }
@@ -1173,7 +1173,7 @@ fn stress_shared() {
             let tx = tx.clone();
             Thread::spawn(move|| {
                 for _ in range(0, AMT) { tx.send(1).unwrap(); }
-            }).detach();
+            });
         }
         drop(tx);
         t.join().ok().unwrap();
@@ -1183,14 +1183,14 @@ fn stress_shared() {
     fn send_from_outside_runtime() {
         let (tx1, rx1) = channel::<()>();
         let (tx2, rx2) = channel::<int>();
-        let t1 = Thread::spawn(move|| {
+        let t1 = Thread::scoped(move|| {
             tx1.send(()).unwrap();
             for _ in range(0i, 40) {
                 assert_eq!(rx2.recv().unwrap(), 1);
             }
         });
         rx1.recv().unwrap();
-        let t2 = Thread::spawn(move|| {
+        let t2 = Thread::scoped(move|| {
             for _ in range(0i, 40) {
                 tx2.send(1).unwrap();
             }
@@ -1202,7 +1202,7 @@ fn send_from_outside_runtime() {
     #[test]
     fn recv_from_outside_runtime() {
         let (tx, rx) = channel::<int>();
-        let t = Thread::spawn(move|| {
+        let t = Thread::scoped(move|| {
             for _ in range(0i, 40) {
                 assert_eq!(rx.recv().unwrap(), 1);
             }
@@ -1217,11 +1217,11 @@ fn recv_from_outside_runtime() {
     fn no_runtime() {
         let (tx1, rx1) = channel::<int>();
         let (tx2, rx2) = channel::<int>();
-        let t1 = Thread::spawn(move|| {
+        let t1 = Thread::scoped(move|| {
             assert_eq!(rx1.recv().unwrap(), 1);
             tx2.send(2).unwrap();
         });
-        let t2 = Thread::spawn(move|| {
+        let t2 = Thread::scoped(move|| {
             tx1.send(1).unwrap();
             assert_eq!(rx2.recv().unwrap(), 2);
         });
@@ -1254,7 +1254,7 @@ fn oneshot_single_thread_send_port_close() {
     #[test]
     fn oneshot_single_thread_recv_chan_close() {
         // Receiving on a closed chan will panic
-        let res = Thread::spawn(move|| {
+        let res = Thread::scoped(move|| {
             let (tx, rx) = channel::<int>();
             drop(tx);
             rx.recv().unwrap();
@@ -1336,7 +1336,7 @@ fn oneshot_multi_task_recv_then_close() {
         let _t = Thread::spawn(move|| {
             drop(tx);
         });
-        let res = Thread::spawn(move|| {
+        let res = Thread::scoped(move|| {
             assert!(rx.recv().unwrap() == box 10);
         }).join();
         assert!(res.is_err());
@@ -1360,7 +1360,7 @@ fn oneshot_multi_thread_send_close_stress() {
             let _t = Thread::spawn(move|| {
                 drop(rx);
             });
-            let _ = Thread::spawn(move|| {
+            let _ = Thread::scoped(move|| {
                 tx.send(1).unwrap();
             }).join();
         }
@@ -1371,15 +1371,15 @@ fn oneshot_multi_thread_recv_close_stress() {
         for _ in range(0, stress_factor()) {
             let (tx, rx) = channel::<int>();
             Thread::spawn(move|| {
-                let res = Thread::spawn(move|| {
+                let res = Thread::scoped(move|| {
                     rx.recv().unwrap();
                 }).join();
                 assert!(res.is_err());
-            }).detach();
+            });
             let _t = Thread::spawn(move|| {
                 Thread::spawn(move|| {
                     drop(tx);
-                }).detach();
+                });
             });
         }
     }
@@ -1409,7 +1409,7 @@ fn send(tx: Sender<Box<int>>, i: int) {
                 Thread::spawn(move|| {
                     tx.send(box i).unwrap();
                     send(tx, i + 1);
-                }).detach();
+                });
             }
 
             fn recv(rx: Receiver<Box<int>>, i: int) {
@@ -1418,7 +1418,7 @@ fn recv(rx: Receiver<Box<int>>, i: int) {
                 Thread::spawn(move|| {
                     assert!(rx.recv().unwrap() == box i);
                     recv(rx, i + 1);
-                }).detach();
+                });
             }
         }
     }
@@ -1439,7 +1439,7 @@ fn shared_chan_stress() {
             let tx = tx.clone();
             Thread::spawn(move|| {
                 tx.send(()).unwrap();
-            }).detach();
+            });
         }
 
         for _ in range(0, total) {
@@ -1644,7 +1644,7 @@ fn chan_gone_concurrent() {
         Thread::spawn(move|| {
             tx.send(1).unwrap();
             tx.send(1).unwrap();
-        }).detach();
+        });
         while rx.recv().is_ok() {}
     }
 
@@ -1653,7 +1653,7 @@ fn stress() {
         let (tx, rx) = sync_channel::<int>(0);
         Thread::spawn(move|| {
             for _ in range(0u, 10000) { tx.send(1).unwrap(); }
-        }).detach();
+        });
         for _ in range(0u, 10000) {
             assert_eq!(rx.recv().unwrap(), 1);
         }
@@ -1675,13 +1675,13 @@ fn stress_shared() {
                 _ => {}
             }
             dtx.send(()).unwrap();
-        }).detach();
+        });
 
         for _ in range(0, NTHREADS) {
             let tx = tx.clone();
             Thread::spawn(move|| {
                 for _ in range(0, AMT) { tx.send(1).unwrap(); }
-            }).detach();
+            });
         }
         drop(tx);
         drx.recv().unwrap();
@@ -1712,7 +1712,7 @@ fn oneshot_single_thread_send_port_close() {
     #[test]
     fn oneshot_single_thread_recv_chan_close() {
         // Receiving on a closed chan will panic
-        let res = Thread::spawn(move|| {
+        let res = Thread::scoped(move|| {
             let (tx, rx) = sync_channel::<int>(0);
             drop(tx);
             rx.recv().unwrap();
@@ -1800,7 +1800,7 @@ fn oneshot_multi_task_recv_then_close() {
         let _t = Thread::spawn(move|| {
             drop(tx);
         });
-        let res = Thread::spawn(move|| {
+        let res = Thread::scoped(move|| {
             assert!(rx.recv().unwrap() == box 10);
         }).join();
         assert!(res.is_err());
@@ -1824,7 +1824,7 @@ fn oneshot_multi_thread_send_close_stress() {
             let _t = Thread::spawn(move|| {
                 drop(rx);
             });
-            let _ = Thread::spawn(move || {
+            let _ = Thread::scoped(move || {
                 tx.send(1).unwrap();
             }).join();
         }
@@ -1835,7 +1835,7 @@ fn oneshot_multi_thread_recv_close_stress() {
         for _ in range(0, stress_factor()) {
             let (tx, rx) = sync_channel::<int>(0);
             let _t = Thread::spawn(move|| {
-                let res = Thread::spawn(move|| {
+                let res = Thread::scoped(move|| {
                     rx.recv().unwrap();
                 }).join();
                 assert!(res.is_err());
@@ -1843,7 +1843,7 @@ fn oneshot_multi_thread_recv_close_stress() {
             let _t = Thread::spawn(move|| {
                 Thread::spawn(move|| {
                     drop(tx);
-                }).detach();
+                });
             });
         }
     }
@@ -1873,7 +1873,7 @@ fn send(tx: SyncSender<Box<int>>, i: int) {
                 Thread::spawn(move|| {
                     tx.send(box i).unwrap();
                     send(tx, i + 1);
-                }).detach();
+                });
             }
 
             fn recv(rx: Receiver<Box<int>>, i: int) {
@@ -1882,7 +1882,7 @@ fn recv(rx: Receiver<Box<int>>, i: int) {
                 Thread::spawn(move|| {
                     assert!(rx.recv().unwrap() == box i);
                     recv(rx, i + 1);
-                }).detach();
+                });
             }
         }
     }
@@ -1903,7 +1903,7 @@ fn shared_chan_stress() {
             let tx = tx.clone();
             Thread::spawn(move|| {
                 tx.send(()).unwrap();
-            }).detach();
+            });
         }
 
         for _ in range(0, total) {
index 9ad24a5a11ec5dfb61080a507b4d4a61920a8198..f8eae1322bf1f7b9bbeb5e2c6b38d870d6c1a018 100644 (file)
@@ -188,7 +188,7 @@ fn test() {
                     q.push(i);
                 }
                 tx.send(()).unwrap();
-            }).detach();
+            });
         }
 
         let mut i = 0u;
index 6b3dd89f33b07fcc71cc4a4a02cdfd7c4072ec2a..6eef428f558aa93aedc3fadc1d3569a1c51e06f2 100644 (file)
@@ -75,7 +75,7 @@
 ///             tx.send(()).unwrap();
 ///         }
 ///         // the lock is unlocked here when `data` goes out of scope.
-///     }).detach();
+///     });
 /// }
 ///
 /// rx.recv().unwrap();
@@ -90,7 +90,7 @@
 /// let lock = Arc::new(Mutex::new(0u));
 /// let lock2 = lock.clone();
 ///
-/// let _ = Thread::spawn(move || -> () {
+/// let _ = Thread::scoped(move || -> () {
 ///     // This thread will acquire the mutex first, unwrapping the result of
 ///     // `lock` because the lock has not been poisoned.
 ///     let _lock = lock2.lock().unwrap();
@@ -376,9 +376,9 @@ fn inc() {
         let (tx, rx) = channel();
         for _ in range(0, K) {
             let tx2 = tx.clone();
-            Thread::spawn(move|| { inc(); tx2.send(()).unwrap(); }).detach();
+            Thread::spawn(move|| { inc(); tx2.send(()).unwrap(); });
             let tx2 = tx.clone();
-            Thread::spawn(move|| { inc(); tx2.send(()).unwrap(); }).detach();
+            Thread::spawn(move|| { inc(); tx2.send(()).unwrap(); });
         }
 
         drop(tx);
@@ -453,7 +453,7 @@ fn test_arc_condvar_poison() {
     fn test_mutex_arc_poison() {
         let arc = Arc::new(Mutex::new(1i));
         let arc2 = arc.clone();
-        let _ = Thread::spawn(move|| {
+        let _ = Thread::scoped(move|| {
             let lock = arc2.lock().unwrap();
             assert_eq!(*lock, 2);
         }).join();
@@ -480,7 +480,7 @@ fn test_mutex_arc_nested() {
     fn test_mutex_arc_access_in_unwind() {
         let arc = Arc::new(Mutex::new(1i));
         let arc2 = arc.clone();
-        let _ = Thread::spawn(move|| -> () {
+        let _ = Thread::scoped(move|| -> () {
             struct Unwinder {
                 i: Arc<Mutex<int>>,
             }
index aa2d957a3eb5e14bb3268b2e539fcc51e31ff939..b32faf2d03f14d4966b7aa6bfbc24fc4c631499b 100644 (file)
@@ -159,7 +159,7 @@ fn stampede_once() {
                     assert!(run);
                 }
                 tx.send(()).unwrap();
-            }).detach();
+            });
         }
 
         unsafe {
index 4afd5bb63f4fec79c368880afcd2b433d23d0d48..00b783d9661156940ff75da288070dc5756373f9 100644 (file)
@@ -411,7 +411,7 @@ fn frob() {
                     }
                 }
                 drop(tx);
-            }).detach();
+            });
         }
         drop(tx);
         let _ = rx.recv();
@@ -422,7 +422,7 @@ fn frob() {
     fn test_rw_arc_poison_wr() {
         let arc = Arc::new(RwLock::new(1i));
         let arc2 = arc.clone();
-        let _: Result<uint, _> = Thread::spawn(move|| {
+        let _: Result<uint, _> = Thread::scoped(move|| {
             let _lock = arc2.write().unwrap();
             panic!();
         }).join();
@@ -433,7 +433,7 @@ fn test_rw_arc_poison_wr() {
     fn test_rw_arc_poison_ww() {
         let arc = Arc::new(RwLock::new(1i));
         let arc2 = arc.clone();
-        let _: Result<uint, _> = Thread::spawn(move|| {
+        let _: Result<uint, _> = Thread::scoped(move|| {
             let _lock = arc2.write().unwrap();
             panic!();
         }).join();
@@ -444,7 +444,7 @@ fn test_rw_arc_poison_ww() {
     fn test_rw_arc_no_poison_rr() {
         let arc = Arc::new(RwLock::new(1i));
         let arc2 = arc.clone();
-        let _: Result<uint, _> = Thread::spawn(move|| {
+        let _: Result<uint, _> = Thread::scoped(move|| {
             let _lock = arc2.read().unwrap();
             panic!();
         }).join();
@@ -455,7 +455,7 @@ fn test_rw_arc_no_poison_rr() {
     fn test_rw_arc_no_poison_rw() {
         let arc = Arc::new(RwLock::new(1i));
         let arc2 = arc.clone();
-        let _: Result<uint, _> = Thread::spawn(move|| {
+        let _: Result<uint, _> = Thread::scoped(move|| {
             let _lock = arc2.read().unwrap();
             panic!()
         }).join();
@@ -478,13 +478,13 @@ fn test_rw_arc() {
                 *lock = tmp + 1;
             }
             tx.send(()).unwrap();
-        }).detach();
+        });
 
         // Readers try to catch the writer in the act
         let mut children = Vec::new();
         for _ in range(0u, 5) {
             let arc3 = arc.clone();
-            children.push(Thread::spawn(move|| {
+            children.push(Thread::scoped(move|| {
                 let lock = arc3.read().unwrap();
                 assert!(*lock >= 0);
             }));
@@ -505,7 +505,7 @@ fn test_rw_arc() {
     fn test_rw_arc_access_in_unwind() {
         let arc = Arc::new(RwLock::new(1i));
         let arc2 = arc.clone();
-        let _ = Thread::spawn(move|| -> () {
+        let _ = Thread::scoped(move|| -> () {
             struct Unwinder {
                 i: Arc<RwLock<int>>,
             }
index 505819fbf8a246cf4ee618b64e89cb921dd8d8a7..8d44084671aad2c61c3a77ad42b8021ec5606aaf 100644 (file)
@@ -193,7 +193,7 @@ fn test_sem_runtime_friendly_blocking() {
                 tx.send(()).unwrap();
                 drop(s2.access());
                 tx.send(()).unwrap();
-            }).detach();
+            });
             rx.recv().unwrap(); // wait for child to come alive
         }
         rx.recv().unwrap(); // wait for child to be done
index 088827dc0842d9041d70db2f98f60dbed7904e13..278528bdb388bd711c747be4143e338104702c8b 100644 (file)
@@ -132,7 +132,7 @@ fn spawn_in_pool(jobs: Arc<Mutex<Receiver<Thunk>>>) {
         }
 
         sentinel.cancel();
-    }).detach();
+    });
 }
 
 #[cfg(test)]
index bdf1bf3dfd02ceca099d0be7d70e2cc3324be749..f940b6ed3682e5253257d5fbd433cfc5e894b4a0 100644 (file)
@@ -99,7 +99,7 @@ pub fn boot<T, F>(&'static self, f: F, helper: fn(helper_signal::signal, Receive
                     let _g = self.lock.lock().unwrap();
                     *self.shutdown.get() = true;
                     self.cond.notify_one()
-                }).detach();
+                });
 
                 rt::at_exit(move|:| { self.shutdown() });
                 *self.initialized.get() = true;
index 9e12a7b592ae31210671cac81353e2ebfe0dc3f0..5153b6b90a79f063f53d6bbef966cac06a92ede9 100644 (file)
@@ -332,9 +332,6 @@ pub struct Thread {
     inner: Arc<Inner>,
 }
 
-#[stable]
-unsafe impl Sync for Thread {}
-
 impl Thread {
     // Used only internally to construct a thread object without spawning
     fn new(name: Option<String>) -> Thread {
@@ -520,14 +517,14 @@ mod test {
 
     #[test]
     fn test_unnamed_thread() {
-        Thread::spawn(move|| {
+        Thread::scoped(move|| {
             assert!(Thread::current().name().is_none());
         }).join().map_err(|_| ()).unwrap();
     }
 
     #[test]
     fn test_named_thread() {
-        Builder::new().name("ada lovelace".to_string()).spawn(move|| {
+        Builder::new().name("ada lovelace".to_string()).scoped(move|| {
             assert!(Thread::current().name().unwrap() == "ada lovelace".to_string());
         }).join().map_err(|_| ()).unwrap();
     }
@@ -537,13 +534,13 @@ fn test_run_basic() {
         let (tx, rx) = channel();
         Thread::spawn(move|| {
             tx.send(()).unwrap();
-        }).detach();
+        });
         rx.recv().unwrap();
     }
 
     #[test]
     fn test_join_success() {
-        match Thread::spawn(move|| -> String {
+        match Thread::scoped(move|| -> String {
             "Success!".to_string()
         }).join().as_ref().map(|s| s.as_slice()) {
             result::Result::Ok("Success!") => (),
@@ -553,7 +550,7 @@ fn test_join_success() {
 
     #[test]
     fn test_join_panic() {
-        match Thread::spawn(move|| {
+        match Thread::scoped(move|| {
             panic!()
         }).join() {
             result::Result::Err(_) => (),
@@ -575,7 +572,7 @@ fn f(i: int, tx: Sender<()>) {
                 } else {
                     f(i - 1, tx);
                 }
-            }).detach();
+            });
 
         }
         f(10, tx);
@@ -589,8 +586,8 @@ fn test_spawn_sched_childs_on_default_sched() {
         Thread::spawn(move|| {
             Thread::spawn(move|| {
                 tx.send(()).unwrap();
-            }).detach();
-        }).detach();
+            });
+        });
 
         rx.recv().unwrap();
     }
@@ -613,7 +610,7 @@ fn avoid_copying_the_body<F>(spawnfn: F) where F: FnOnce(Thunk) {
     #[test]
     fn test_avoid_copying_the_body_spawn() {
         avoid_copying_the_body(|v| {
-            Thread::spawn(move || v.invoke(())).detach();
+            Thread::spawn(move || v.invoke(()));
         });
     }
 
@@ -622,14 +619,14 @@ fn test_avoid_copying_the_body_thread_spawn() {
         avoid_copying_the_body(|f| {
             Thread::spawn(move|| {
                 f.invoke(());
-            }).detach();
+            });
         })
     }
 
     #[test]
     fn test_avoid_copying_the_body_join() {
         avoid_copying_the_body(|f| {
-            let _ = Thread::spawn(move|| {
+            let _ = Thread::scoped(move|| {
                 f.invoke(())
             }).join();
         })
@@ -645,21 +642,21 @@ fn test_child_doesnt_ref_parent() {
         fn child_no(x: uint) -> Thunk {
             return Thunk::new(move|| {
                 if x < GENERATIONS {
-                    Thread::spawn(move|| child_no(x+1).invoke(())).detach();
+                    Thread::spawn(move|| child_no(x+1).invoke(()));
                 }
             });
         }
-        Thread::spawn(|| child_no(0).invoke(())).detach();
+        Thread::spawn(|| child_no(0).invoke(()));
     }
 
     #[test]
     fn test_simple_newsched_spawn() {
-        Thread::spawn(move || {}).detach();
+        Thread::spawn(move || {});
     }
 
     #[test]
     fn test_try_panic_message_static_str() {
-        match Thread::spawn(move|| {
+        match Thread::scoped(move|| {
             panic!("static string");
         }).join() {
             Err(e) => {
@@ -673,7 +670,7 @@ fn test_try_panic_message_static_str() {
 
     #[test]
     fn test_try_panic_message_owned_str() {
-        match Thread::spawn(move|| {
+        match Thread::scoped(move|| {
             panic!("owned string".to_string());
         }).join() {
             Err(e) => {
@@ -687,7 +684,7 @@ fn test_try_panic_message_owned_str() {
 
     #[test]
     fn test_try_panic_message_any() {
-        match Thread::spawn(move|| {
+        match Thread::scoped(move|| {
             panic!(box 413u16 as Box<Any + Send>);
         }).join() {
             Err(e) => {
@@ -705,7 +702,7 @@ fn test_try_panic_message_any() {
     fn test_try_panic_message_unit_struct() {
         struct Juju;
 
-        match Thread::spawn(move|| {
+        match Thread::scoped(move|| {
             panic!(Juju)
         }).join() {
             Err(ref e) if e.is::<Juju>() => {}
@@ -719,7 +716,7 @@ fn test_stdout() {
         let mut reader = ChanReader::new(rx);
         let stdout = ChanWriter::new(tx);
 
-        let r = Builder::new().stdout(box stdout as Box<Writer + Send>).spawn(move|| {
+        let r = Builder::new().stdout(box stdout as Box<Writer + Send>).scoped(move|| {
             print!("Hello, world!");
         }).join();
         assert!(r.is_ok());
index e0cbaa8ca50edbbb99c63a147445d1951f8551a7..c8cad7765e690c72842a29b8c41de21c81b37c60 100644 (file)
@@ -87,7 +87,7 @@ pub mod __impl {
 ///         assert_eq!(*f.borrow(), 1);
 ///         *f.borrow_mut() = 3;
 ///     });
-/// }).detach();
+/// });
 ///
 /// // we retain our original value of 2 despite the child thread
 /// FOO.with(|f| {
@@ -581,7 +581,7 @@ fn foo() -> Foo {
         }
         thread_local!(static FOO: Foo = foo());
 
-        Thread::spawn(|| {
+        Thread::scoped(|| {
             assert!(FOO.state() == State::Uninitialized);
             FOO.with(|_| {
                 assert!(FOO.state() == State::Valid);
@@ -645,7 +645,7 @@ fn drop(&mut self) {
             }
         }
 
-        Thread::spawn(move|| {
+        Thread::scoped(move|| {
             drop(S1);
         }).join().ok().unwrap();
     }
@@ -663,7 +663,7 @@ fn drop(&mut self) {
             }
         }
 
-        Thread::spawn(move|| unsafe {
+        Thread::scoped(move|| unsafe {
             K1.with(|s| *s.get() = Some(S1));
         }).join().ok().unwrap();
     }
index c417fd94e22eb953a9cd73955cbb63a729f8c52a..6d55848a5839f87006b4e45171b399ef1624bb96 100644 (file)
@@ -1137,11 +1137,11 @@ fn run_test_inner(desc: TestDesc,
                 cfg = cfg.stderr(box stderr as Box<Writer + Send>);
             }
 
-            let result_guard = cfg.spawn(move || { testfn.invoke(()) });
+            let result_guard = cfg.scoped(move || { testfn.invoke(()) });
             let stdout = reader.read_to_end().unwrap().into_iter().collect();
             let test_result = calc_result(&desc, result_guard.join());
             monitor_ch.send((desc.clone(), test_result, stdout)).unwrap();
-        }).detach();
+        });
     }
 
     match testfn {
index ec4c0281d5597071b97ec23867ef915e16e5ddc6..673c38697b79cbf10644f7b8ecc8f97b1b318348 100644 (file)
@@ -15,6 +15,6 @@ pub fn foo<T:Send + Clone>(x: T) -> Receiver<T> {
     let (tx, rx) = channel();
     Thread::spawn(move|| {
         tx.send(x.clone());
-    }).detach();
+    });
     rx
 }
index d1126e742527375d82948e0f4e3065f2f62678c4..387601de8284c0116054edbf6ab555eb270e00c9 100644 (file)
@@ -64,7 +64,7 @@ fn run(args: &[String]) {
         let mut worker_results = Vec::new();
         for _ in range(0u, workers) {
             let to_child = to_child.clone();
-            worker_results.push(Thread::spawn(move|| {
+            worker_results.push(Thread::scoped(move|| {
                 for _ in range(0u, size / workers) {
                     //println!("worker {}: sending {} bytes", i, num_bytes);
                     to_child.send(request::bytes(num_bytes)).unwrap();
@@ -74,7 +74,7 @@ fn run(args: &[String]) {
         }
         Thread::spawn(move|| {
             server(&from_parent, &to_parent);
-        }).detach();
+        });
 
         for r in worker_results.into_iter() {
             let _ = r.join();
index ef22aac776e0334727370b5fcba0cdeedd431af4..d6d01e5452b95d631f751639c745f1c5d6b5b7a6 100644 (file)
@@ -59,7 +59,7 @@ fn run(args: &[String]) {
         let mut worker_results = Vec::new();
         let from_parent = if workers == 1 {
             let (to_child, from_parent) = channel();
-            worker_results.push(Thread::spawn(move|| {
+            worker_results.push(Thread::scoped(move|| {
                 for _ in range(0u, size / workers) {
                     //println!("worker {}: sending {} bytes", i, num_bytes);
                     to_child.send(request::bytes(num_bytes));
@@ -71,7 +71,7 @@ fn run(args: &[String]) {
             let (to_child, from_parent) = channel();
             for _ in range(0u, workers) {
                 let to_child = to_child.clone();
-                worker_results.push(Thread::spawn(move|| {
+                worker_results.push(Thread::scoped(move|| {
                     for _ in range(0u, size / workers) {
                         //println!("worker {}: sending {} bytes", i, num_bytes);
                         to_child.send(request::bytes(num_bytes));
@@ -83,7 +83,7 @@ fn run(args: &[String]) {
         };
         Thread::spawn(move|| {
             server(&from_parent, &to_parent);
-        }).detach();
+        });
 
         for r in worker_results.into_iter() {
             let _ = r.join();
index 5ecc580de08d554ca1c7c49ffa62f25e46c9a055..b854dc11b988abd910304495390132e6591fa611 100644 (file)
@@ -35,7 +35,7 @@ fn run_pair(n: uint) {
         // Create a channel: B->A
         let (btx, brx) = channel();
 
-        let guard_a = Thread::spawn(move|| {
+        let guard_a = Thread::scoped(move|| {
             let (tx, rx) = (atx, brx);
             for _ in range(0, n) {
                 tx.send(()).unwrap();
@@ -43,7 +43,7 @@ fn run_pair(n: uint) {
             }
         });
 
-        let guard_b = Thread::spawn(move|| {
+        let guard_b = Thread::scoped(move|| {
             let (tx, rx) = (btx, arx);
             for _ in range(0, n) {
                 rx.recv().unwrap();
index 8b212555d4011cdb2d7d1a301d2b4172127befd8..37210cd93f1b319b05e57af130477ea6d2f19b1b 100644 (file)
@@ -25,7 +25,7 @@ fn parfib(n: uint) -> uint {
     let (tx, rx) = channel();
     Thread::spawn(move|| {
         tx.send(parfib(n-1));
-    }).detach();
+    });
     let m2 = parfib(n-2);
     return (rx.recv().unwrap() + m2);
 }
index c7a43d61a9a86b1215626a292fbbdafc597ca76f..737776368dd0c5150b09e6aa34edea71461229a7 100644 (file)
@@ -95,7 +95,7 @@ fn main() {
     let mut messages = range_step(min_depth, max_depth + 1, 2).map(|depth| {
             use std::num::Int;
             let iterations = 2i.pow((max_depth - depth + min_depth) as uint);
-            Thread::spawn(move|| {
+            Thread::scoped(move|| {
                 let mut chk = 0;
                 for i in range(1, iterations + 1) {
                     let arena = TypedArena::new();
index 96bca25d1c455a031b74620871dded052d323fc4..5c36fccc7f5d8cce7f329c64a2c0c428047e1f2a 100644 (file)
@@ -195,7 +195,7 @@ fn rendezvous(nn: uint, set: Vec<Color>) {
                          from_rendezvous,
                          to_rendezvous,
                          to_rendezvous_log);
-            }).detach();
+            });
             to_creature
         }).collect();
 
index 7dca2b24fc11e8fa9b9ef817f74ee26d9fd4e990..2725c7cf6d63a8420cd767abd19b7ebd3f6729f1 100644 (file)
@@ -168,7 +168,7 @@ fn fannkuch(n: i32) -> (i32, i32) {
     for (i, j) in range(0, N).zip(iter::count(0, k)) {
         let max = cmp::min(j+k, perm.max());
 
-        futures.push(Thread::spawn(move|| {
+        futures.push(Thread::scoped(move|| {
             work(perm, j as uint, max as uint)
         }))
     }
index e6ef6a8c8c9ec4da7841ca5e263852b94cb25933..8ce4edccbd3a0ce75d1133f07e1409914299b1a2 100644 (file)
@@ -173,7 +173,7 @@ fn main() {
 
         Thread::spawn(move|| {
             make_sequence_processor(sz, &from_parent, &to_parent_);
-        }).detach();
+        });
 
         to_child
     }).collect::<Vec<Sender<Vec<u8> >> >();
index 28d7488c9bf8f837f3458d0d2f0d9b0d180a0c58..760758a3406ae557253f0d49cc1158707815d58d 100644 (file)
@@ -304,11 +304,11 @@ fn main() {
 
     let nb_freqs: Vec<_> = range(1u, 3).map(|i| {
         let input = input.clone();
-        (i, Thread::spawn(move|| generate_frequencies(input.as_slice(), i)))
+        (i, Thread::scoped(move|| generate_frequencies(input.as_slice(), i)))
     }).collect();
     let occ_freqs: Vec<_> = OCCURRENCES.iter().map(|&occ| {
         let input = input.clone();
-        Thread::spawn(move|| generate_frequencies(input.as_slice(), occ.len()))
+        Thread::scoped(move|| generate_frequencies(input.as_slice(), occ.len()))
     }).collect();
 
     for (i, freq) in nb_freqs.into_iter() {
index 16d6036d4c40ff8eb9b6d228941e37b088a41815..f6124c1271f05b1df5d31d81fdc630ea121e5eb0 100644 (file)
@@ -82,7 +82,7 @@ fn mandelbrot<W: io::Writer>(w: uint, mut out: W) -> io::IoResult<()> {
     let mut precalc_i = Vec::with_capacity(h);
 
     let precalc_futures = range(0, WORKERS).map(|i| {
-        Thread::spawn(move|| {
+        Thread::scoped(move|| {
             let mut rs = Vec::with_capacity(w / WORKERS);
             let mut is = Vec::with_capacity(w / WORKERS);
 
@@ -123,7 +123,7 @@ fn mandelbrot<W: io::Writer>(w: uint, mut out: W) -> io::IoResult<()> {
         let vec_init_r = arc_init_r.clone();
         let vec_init_i = arc_init_i.clone();
 
-        Thread::spawn(move|| {
+        Thread::scoped(move|| {
             let mut res: Vec<u8> = Vec::with_capacity((chunk_size * w) / 8);
             let init_r_slice = vec_init_r.as_slice();
 
index ca3d10afa5d47e38ee02e001c62f916844cece64..34a036eff375024fb839b8daaf2000b0f5c5fcb7 100644 (file)
@@ -321,7 +321,7 @@ fn par_search(masks: Vec<Vec<Vec<u64>>>) -> Data {
             let mut data = Data::new();
             search(&*masks, m, 1, List::Cons(m, &List::Nil), &mut data);
             tx.send(data).unwrap();
-        }).detach();
+        });
     }
 
     // collecting the results
index 84ceb432048bc674996125967ac7e21b636b42fa..3953d3f9cdd33a7789a74f3eb9f85b6df4029ff0 100644 (file)
@@ -35,15 +35,15 @@ fn pfib(tx: &Sender<int>, n: int) {
         } else {
             let (tx1, rx) = channel();
             let tx2 = tx1.clone();
-            Thread::spawn(move|| pfib(&tx2, n - 1)).detach();
+            Thread::spawn(move|| pfib(&tx2, n - 1));
             let tx2 = tx1.clone();
-            Thread::spawn(move|| pfib(&tx2, n - 2)).detach();
+            Thread::spawn(move|| pfib(&tx2, n - 2));
             tx.send(rx.recv().unwrap() + rx.recv().unwrap());
         }
     }
 
     let (tx, rx) = channel();
-    Thread::spawn(move|| pfib(&tx, n) ).detach();
+    Thread::spawn(move|| pfib(&tx, n) );
     rx.recv().unwrap()
 }
 
@@ -78,7 +78,7 @@ fn stress_task(id: int) {
 fn stress(num_tasks: int) {
     let mut results = Vec::new();
     for i in range(0, num_tasks) {
-        results.push(Thread::spawn(move|| {
+        results.push(Thread::scoped(move|| {
             stress_task(i);
         }));
     }
index 9dd1003785051e4c7a21c7e300554288d241dd56..da427b36e8d0fe2e1bf7ddfe45b5feb920d4240c 100644 (file)
@@ -46,10 +46,10 @@ fn start(n_tasks: int, token: int) {
     tx.send(token);
     for i in range(2, n_tasks + 1) {
         let (tx, next_rx) = channel();
-        Thread::spawn(move|| roundtrip(i, tx, rx)).detach();
+        Thread::spawn(move|| roundtrip(i, tx, rx));
         rx = next_rx;
     }
-    Thread::spawn(move|| roundtrip(1, tx, rx)).detach();
+    Thread::spawn(move|| roundtrip(1, tx, rx));
 }
 
 fn roundtrip(id: int, tx: Sender<int>, rx: Receiver<int>) {
index 9e78ede74ca917ef9df1b119cda056e1c29bb76e..55e8dcbb6e8fbf4af74fd0611077f366880528cd 100644 (file)
@@ -36,7 +36,7 @@ fn main() {
 fn run(repeat: int, depth: int) {
     for _ in range(0, repeat) {
         let dur = Duration::span(|| {
-            let _ = Thread::spawn(move|| {
+            let _ = Thread::scoped(move|| {
                 recurse_or_panic(depth, None)
             }).join();
         });
index 30918d49090350fc28142d902c5898e1aec9bfa4..a2a380279f34d69538c90feaa0ff5a80fddadc24 100644 (file)
@@ -35,7 +35,7 @@ fn child_generation(gens_left: uint, tx: Sender<()>) {
         } else {
             tx.send(()).unwrap()
         }
-    }).detach();
+    });
 }
 
 fn main() {
index 488a5ec9edada04ef3cdd8848b28031956e32e06..eb1e30e2846766e0a0ef3a5e9a6f49b36210c81e 100644 (file)
@@ -15,7 +15,7 @@
 fn f(n: uint) {
     let mut i = 0u;
     while i < n {
-        let _ = Thread::spawn(move|| g()).join();
+        let _ = Thread::scoped(move|| g()).join();
         i += 1u;
     }
 }
@@ -33,5 +33,5 @@ fn main() {
     };
     let n = args[1].parse().unwrap();
     let mut i = 0u;
-    while i < n { Thread::spawn(move|| f(n) ).detach(); i += 1u; }
+    while i < n { Thread::spawn(move|| f(n) ); i += 1u; }
 }
index c943dfe9f0c604b9351b11b309b8e930df259b9c..9beee3b1843f3b98bf97440450aea479463f6573 100644 (file)
@@ -13,7 +13,7 @@
 use std::thread::Thread;
 
 fn main() {
-    let r: Result<int,_> = Thread::spawn(move|| {
+    let r: Result<int,_> = Thread::scoped(move|| {
         panic!("test");
         1i
     }).join();
index 57901ebcfc622d176cae53eb995060407711bf20..714cec6fb3d2091f3245315f7120eda9fe95fca9 100644 (file)
@@ -13,7 +13,7 @@
 use std::thread::Builder;
 
 fn main() {
-    let r: Result<int,_> = Builder::new().name("owned name".to_string()).spawn(move|| {
+    let r: Result<int,_> = Builder::new().name("owned name".to_string()).scoped(move|| {
         panic!("test");
         1i
     }).join();
index 8aade64163056e1c26ec7349f91e43dfd4930dea..d58148810da1fd22109596710d7035307732943b 100644 (file)
@@ -15,7 +15,7 @@
 fn main() {
     // the purpose of this test is to make sure that task::spawn()
     // works when provided with a bare function:
-    let r = Thread::spawn(startfn).join();
+    let r = Thread::scoped(startfn).join();
     if r.is_err() {
         panic!()
     }
index faac858e76e0b34aca046641d6fa04ecb821c18e..bd88cb19aa7c0bf1f9a264024a446860169f6ee5 100644 (file)
@@ -22,7 +22,7 @@ fn drop(&mut self) {
 }
 
 fn main() {
-    Thread::spawn(move|| {
+    Thread::scoped(move|| {
         let _a = A;
         lib::callback(|| panic!());
         1i
index 440b7afa984f796ca2d7aab32420dd6f27b1ceb8..526819940d00322f28cd68124b15969348b92276 100644 (file)
@@ -45,5 +45,5 @@ pub fn fails() {
 }
 
 pub fn main() {
-    Thread::spawn(fails).join();
+    Thread::scoped(fails).join();
 }
index 3298976de6ce34d8bd6f13fe8af4d629b951f1fe..eeb044e560422ba07b0c5c0df67f76ec3517e81a 100644 (file)
@@ -90,7 +90,7 @@ pub fn test_destroy_actually_kills(force: bool) {
             _ = rx2.recv() => unsafe { libc::exit(1) },
             _ = rx1.recv() => {}
         }
-    }).detach();
+    });
     match p.wait().unwrap() {
         ExitStatus(..) => panic!("expected a signal"),
         ExitSignal(..) => tx.send(()).unwrap(),
index ce3e447350d40cb57877b5c936e647a53411ce33..c1df9d53ad440516228977777aa40b5a6a1ce1a8 100644 (file)
@@ -21,7 +21,7 @@ fn rust_dbg_call(cb: extern "C" fn(libc::uintptr_t),
 
 pub fn main() {
     unsafe {
-        Thread::spawn(move|| {
+        Thread::scoped(move|| {
             let i = &100i;
             rust_dbg_call(callback, mem::transmute(i));
         }).join();
index 3bcce5388715d6e34df5117549980565e4d765ef..f83698edc90526d1cd236410d9ed1f726f3b9a30 100644 (file)
@@ -1,4 +1,3 @@
-
 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
 // file at the top-level directory of this distribution and at
 // http://rust-lang.org/COPYRIGHT.
@@ -37,7 +36,7 @@ fn start_mappers(ctrl: Sender<ctrl_proto>, inputs: Vec<String>) {
         for i in inputs.iter() {
             let ctrl = ctrl.clone();
             let i = i.clone();
-            Thread::spawn(move|| map_task(ctrl.clone(), i.clone()) ).detach();
+            Thread::spawn(move|| map_task(ctrl.clone(), i.clone()) );
         }
     }
 
index 856fbbd00b20b2ef6112a7bf30f0c9fd8fd2337d..a6a4d21e8f2c04aefe297e38c100ed31e987ef9a 100644 (file)
@@ -12,7 +12,7 @@
 use std::thread::Thread;
 
 fn main() {
-    Thread::spawn(move|| customtask()).join().ok().unwrap();
+    Thread::scoped(move|| customtask()).join().ok().unwrap();
 }
 
 fn customtask() {
index b9339c1cc0d03ad030a746487036669e53b173bb..bef0ff5fc2cd2551c94124bc44696c44e61d7140 100644 (file)
@@ -22,7 +22,7 @@ fn helper(rx: Receiver<Sender<()>>) {
 
 fn main() {
     let (tx, rx) = channel();
-    let _t = Thread::spawn(move|| { helper(rx) }).detach();
+    let _t = Thread::spawn(move|| { helper(rx) });
     let (snd, rcv) = channel::<int>();
     for _ in range(1i, 100000i) {
         snd.send(1i).unwrap();
index b2b819a110305ec5265ebd396afab5ee8014b5f2..6b03a499f15773728e54d603a344f929bfa4d8d5 100644 (file)
@@ -20,7 +20,7 @@ fn main() {
     // Check that both closures are capturing by value
     assert_eq!(1, mem::size_of_val(&closure));
 
-    Thread::spawn(move|| {
+    Thread::scoped(move|| {
         let ok = closure;
     }).join().ok().unwrap();
 }
index 99758f9f777d6511e8b837a533b8478d60243642..e25b3e8e89c6c16175ce85e79f0d1807f1d3c6fb 100644 (file)
@@ -24,5 +24,5 @@ pub fn main() {
     let mut stdin = std::io::stdin();
     Thread::spawn(move|| {
         let _ = stdin.read_to_end();
-    }).detach();
+    });
 }
index 4bbbe978192b13f2e85ab112f2a69e9129acb40e..810bf385d7e0b0946d1c05921155a6fbc53d922d 100644 (file)
@@ -14,7 +14,7 @@
 static generations: uint = 1024+256+128+49;
 
 fn spawn(f: Thunk) {
-    Builder::new().stack_size(32 * 1024).spawn(move|| f.invoke(())).detach()
+    Builder::new().stack_size(32 * 1024).spawn(move|| f.invoke(()));
 }
 
 fn child_no(x: uint) -> Thunk {
index 30e1a14ecff8fc776f44862abb78e940be73911c..9c00348ad6a5155814859b31da8af2208a3383bc 100644 (file)
@@ -17,7 +17,7 @@ pub fn main() {
 
     tx.send("hello, world").unwrap();
 
-    Thread::spawn(move|| {
+    Thread::scoped(move|| {
         println(rx.recv().unwrap());
     }).join().ok().unwrap();
 }
index 7e53722726f2cef8d53b748ccd69ee0fb0085c60..a19bfca721a7c2318dc705a183551300c2e808dc 100644 (file)
@@ -14,7 +14,7 @@
 pub fn main() {
     let (tx, rx) = channel::<&'static str>();
 
-    let t = Thread::spawn(move|| {
+    let t = Thread::scoped(move|| {
         assert_eq!(rx.recv().unwrap(), "hello, world");
     });
 
index 3d5e32972e7247ef548c3b2e90e350faec1a7336..3ea6d5d4f2fcbeefb2ed53e6a985460fe778ddb0 100644 (file)
 use std::thread::Thread;
 
 fn main() {
-    assert!(Thread::spawn(move|| int::MIN / -1).join().is_err());
-    assert!(Thread::spawn(move|| i8::MIN / -1).join().is_err());
-    assert!(Thread::spawn(move|| i16::MIN / -1).join().is_err());
-    assert!(Thread::spawn(move|| i32::MIN / -1).join().is_err());
-    assert!(Thread::spawn(move|| i64::MIN / -1).join().is_err());
-    assert!(Thread::spawn(move|| 1i / 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i8 / 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i16 / 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i32 / 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i64 / 0).join().is_err());
-    assert!(Thread::spawn(move|| int::MIN % -1).join().is_err());
-    assert!(Thread::spawn(move|| i8::MIN % -1).join().is_err());
-    assert!(Thread::spawn(move|| i16::MIN % -1).join().is_err());
-    assert!(Thread::spawn(move|| i32::MIN % -1).join().is_err());
-    assert!(Thread::spawn(move|| i64::MIN % -1).join().is_err());
-    assert!(Thread::spawn(move|| 1i % 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i8 % 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i16 % 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i32 % 0).join().is_err());
-    assert!(Thread::spawn(move|| 1i64 % 0).join().is_err());
+    assert!(Thread::scoped(move|| int::MIN / -1).join().is_err());
+    assert!(Thread::scoped(move|| i8::MIN / -1).join().is_err());
+    assert!(Thread::scoped(move|| i16::MIN / -1).join().is_err());
+    assert!(Thread::scoped(move|| i32::MIN / -1).join().is_err());
+    assert!(Thread::scoped(move|| i64::MIN / -1).join().is_err());
+    assert!(Thread::scoped(move|| 1i / 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i8 / 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i16 / 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i32 / 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i64 / 0).join().is_err());
+    assert!(Thread::scoped(move|| int::MIN % -1).join().is_err());
+    assert!(Thread::scoped(move|| i8::MIN % -1).join().is_err());
+    assert!(Thread::scoped(move|| i16::MIN % -1).join().is_err());
+    assert!(Thread::scoped(move|| i32::MIN % -1).join().is_err());
+    assert!(Thread::scoped(move|| i64::MIN % -1).join().is_err());
+    assert!(Thread::scoped(move|| 1i % 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i8 % 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i16 % 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i32 % 0).join().is_err());
+    assert!(Thread::scoped(move|| 1i64 % 0).join().is_err());
 }
index 39695a8339f08aa0017ff4baa150b8df4380b68d..d8b7490124f7055a2b1f08d89599cf1bfa081c74 100644 (file)
@@ -26,7 +26,7 @@ fn periodical(n: int) -> Receiver<bool> {
                 Err(..) => break
             }
         }
-    }).detach();
+    });
     return port;
 }
 
@@ -41,7 +41,7 @@ fn integers() -> Receiver<int> {
             }
             i = i + 1;
         }
-    }).detach();
+    });
     return port;
 }
 
@@ -58,4 +58,3 @@ fn main() {
         }
     }
 }
-
index 509afff3d133bb204744467e0c64cadcbbf08675..54f74239daf8603c81451cfade6a7ac748d4fc75 100644 (file)
@@ -27,7 +27,7 @@ fn fmt(&self, _fmt: &mut fmt::Formatter) -> fmt::Result {
 }
 
 pub fn main() {
-    Thread::spawn(move|| {
+    Thread::scoped(move|| {
         let mut f = Foo(Cell::new(0));
         println!("{}", f);
         let Foo(ref mut f) = f;
index 93bb9557604c49cd9d4e61fa1373b74edd7485bf..cb52ba74bbd683088d2c1807cc72bb8c253766ac 100644 (file)
@@ -14,7 +14,7 @@ macro_rules! expr { ($e: expr) => { $e } }
 
 macro_rules! spawn {
     ($($code: tt)*) => {
-        expr!(Thread::spawn(move|| {$($code)*}).detach())
+        expr!(Thread::spawn(move|| {$($code)*}))
     }
 }
 
index 6b1553cd9f600d924efa784fde15fb7ec8196f8d..64e78c3483bbae41d35503df04db32a339f9de5c 100644 (file)
@@ -23,7 +23,7 @@ fn drop(&mut self) {
 }
 
 fn main() {
-    Thread::spawn(move|| -> () {
+    Thread::scoped(move|| -> () {
         let _a = A;
         panic!();
     }).join().unwrap_err();
index 5c692bf8801815ba5d38c406becc663e77bb5df5..3cc01b967ce6af5d452cc6edad560502e25d7372 100644 (file)
@@ -33,10 +33,9 @@ fn drop(&mut self) {
 }
 
 pub fn main() {
-    let ret = Thread::spawn(move|| {
+    let ret = Thread::scoped(move|| {
         let _a = A { b: B { foo: 3 } };
     }).join();
     assert!(ret.is_err());
     unsafe { assert!(dropped); }
 }
-
index 3ed835dc5bdf9d6907442b65ce701df61c0a448c..a6e4716c3b8a36e0294654b42b24e66c3a7386b6 100644 (file)
@@ -22,7 +22,7 @@ fn test05() {
         println!("{}", *three + n); // will copy x into the closure
         assert_eq!(*three, 3);
     };
-    Thread::spawn(move|| {
+    Thread::scoped(move|| {
         test05_start(fn_to_send);
     }).join().ok().unwrap();
 }
index 246957a4f46087d62f440207ed06869e9f787af2..b8bb3b4e7f8c39dd70eff3464308cf3b9d43b6db 100644 (file)
@@ -36,5 +36,5 @@ pub fn g() {
 }
 
 fn main() {
-    Thread::spawn(move|| { ::b::g() }).join().unwrap_err();
+    Thread::scoped(move|| { ::b::g() }).join().unwrap_err();
 }
index 13f2971871ba89ae218b0ae0a25e71da9cf1beb7..c3612d26c936b408ae683a67b415bff6aba87f99 100644 (file)
@@ -28,6 +28,6 @@ fn foo() {
 }
 
 fn main() {
-    let _ = Thread::spawn(move|| foo()).join();
+    let _ = Thread::scoped(move|| foo()).join();
     unsafe { assert!(DTOR_COUNT == 2); }
 }
index ccbb33d7768c4bff3a30df226d43f4ce87391cf3..c1e6d941d93261e8b8207602992e954f633d6edd 100644 (file)
@@ -32,6 +32,6 @@ fn foo() {
 }
 
 fn main() {
-    let _ = Thread::spawn(move|| foo()).join();
+    let _ = Thread::scoped(move|| foo()).join();
     unsafe { assert!(DTOR_COUNT == 2); }
 }
index bb9de7cecc98c4fb53b021efea3430ab06b1c33f..eaad2abe8f72e4909c7a541c82be4e155e9079e5 100644 (file)
@@ -25,6 +25,6 @@ fn iotask(_tx: &ctx, ip: String) {
 
 pub fn main() {
     let (tx, _rx) = channel::<int>();
-    let t = Thread::spawn(move|| iotask(&tx, "localhost".to_string()) );
+    let t = Thread::scoped(move|| iotask(&tx, "localhost".to_string()) );
     t.join().ok().unwrap();
 }
index 820dd49142ac695ac99588d578d66ba89033af63..8f937afa6b93241ebf5a01316fac9e44256ca702 100644 (file)
@@ -11,7 +11,7 @@
 use std::thread::Thread;
 
 pub fn main() {
-    Thread::spawn(move|| child(10)).join().ok().unwrap();
+    Thread::scoped(move|| child(10)).join().ok().unwrap();
 }
 
 fn child(i: int) { println!("{}", i); assert!((i == 10)); }
index 50c2d79132ef5dee706a58ee14b362e721e27f8a..75104a4ddef008ebf063383b9d36a94af4981c90 100644 (file)
@@ -11,7 +11,7 @@
 use std::thread::Thread;
 
 pub fn main() {
-    let t = Thread::spawn(move|| child((10, 20, 30, 40, 50, 60, 70, 80, 90)) );
+    let t = Thread::scoped(move|| child((10, 20, 30, 40, 50, 60, 70, 80, 90)) );
     t.join().ok().unwrap();
 }
 
index ea594977f905cf81b37912afc1bc8027a830ce3c..858b7a83c6274f475f484666c2f6e36bed5be558 100644 (file)
@@ -17,5 +17,5 @@
 
 pub fn main() {
     let mut t = Builder::new();
-    t.spawn(move|| ()).detach();
+    t.spawn(move|| ());
 }
index 966bb6aa7358bce2e9f400c7dfe02955577c3d7d..180f6e09ba99bb12b0f341e85dfa5c215912e306 100644 (file)
@@ -15,6 +15,6 @@
 fn start() { println!("Started / Finished task."); }
 
 fn test00() {
-    let _ = Thread::spawn(move|| start() ).join();
+    let _ = Thread::scoped(move|| start() ).join();
     println!("Completing.");
 }
index 561c9e91553dd17fc5d9254f99cfc90d94610da7..da080408ad17c8a9be99fc09a2bfd520391db5cc 100644 (file)
@@ -16,7 +16,7 @@
 
 fn test00() {
     let i: int = 0;
-    let mut result = Thread::spawn(move|| {
+    let mut result = Thread::scoped(move|| {
         start(i)
     });
 
index 50667d375a13c0f53345331709f1dfc2efcd9c8b..429c6ce9fb3711531cf0f1765730d8839b29182c 100644 (file)
@@ -19,6 +19,6 @@ fn start(tx: &Sender<int>, start: int, number_of_messages: int) {
 pub fn main() {
     println!("Check that we don't deadlock.");
     let (tx, rx) = channel();
-    let _ = Thread::spawn(move|| { start(&tx, 0, 10) }).join();
+    let _ = Thread::scoped(move|| { start(&tx, 0, 10) }).join();
     println!("Joined task");
 }
index 82e4bd8f6d2a1688b30007e09e85b44c858acc2b..0735e3996eec10ec81986948a1157616b598d143 100644 (file)
@@ -19,7 +19,7 @@ pub fn main() {
     while (i > 0) {
         println!("{}", i);
         let tx = tx.clone();
-        Thread::spawn({let i = i; move|| { child(i, &tx) }}).detach();
+        Thread::spawn({let i = i; move|| { child(i, &tx) }});
         i = i - 1;
     }
 
index e9f7cdf96a83a4a37a379d61cbf80d2e221fca9b..9db5465f7e96e77e03d0dbaa66fdb1490644f28b 100644 (file)
@@ -18,5 +18,5 @@ fn f() {
 }
 
 pub fn main() {
-    let _t = Thread::spawn(move|| f() ).join();
+    let _t = Thread::scoped(move|| f() ).join();
 }
index a002a597481e42ee8a660694f223efa37716037c..306cc0ffcef7cb6127c7a84fe41f6b100713dd80 100644 (file)
@@ -40,7 +40,7 @@ fn test00() {
     let mut results = Vec::new();
     while i < number_of_tasks {
         let tx = tx.clone();
-        results.push(Thread::spawn({
+        results.push(Thread::scoped({
             let i = i;
             move|| {
                 test00_start(&tx, i, number_of_messages)
index d9faf6ee4e4b24a0a1dce1f2a43c41ae36b854ec..6d8de4a6a53d6c090b2cfa7fae564fe5b1739bec 100644 (file)
@@ -24,7 +24,7 @@ fn test00() {
     let (tx, rx) = channel();
     let number_of_messages: int = 10;
 
-    let result = Thread::spawn(move|| {
+    let result = Thread::scoped(move|| {
         test00_start(&tx, number_of_messages);
     });
 
index a7eabe0edb3845468dc07836eb5f4086c82e4c62..7ff5960375cb2d7d20d0f2ea93a9ee791e4222c4 100644 (file)
@@ -17,7 +17,7 @@ fn main() {
     let mut reader = ChanReader::new(rx);
     let stderr = ChanWriter::new(tx);
 
-    let res = thread::Builder::new().stderr(box stderr as Box<Writer + Send>).spawn(move|| -> () {
+    let res = thread::Builder::new().stderr(box stderr as Box<Writer + Send>).scoped(move|| -> () {
         panic!("Hello, world!")
     }).join();
     assert!(res.is_err());
index 3e6158ca82193e3c6c309e08b35d5d6f12ae0c05..cd3cb872fd3bc58fdca1791a001752162b808b30 100644 (file)
@@ -52,7 +52,7 @@ fn test() {
                 }
             }
             srv_tx.send(());
-        }).detach();
+        });
     }
 
     for _ in range(0, N) {
@@ -62,7 +62,7 @@ fn test() {
                 let _s = TcpStream::connect(addr).unwrap();
             }
             cli_tx.send(());
-        }).detach();
+        });
     }
     drop((cli_tx, srv_tx));
 
index 7d226aa9420320b95bd35e40c88735d9b6a83834..0109d64ad5347896f7c9129a27a54dca6cdd11c6 100644 (file)
@@ -29,7 +29,7 @@ fn main() {
         timer::sleep(Duration::milliseconds(30 * 1000));
         println!("timed out!");
         unsafe { libc::exit(1) }
-    }).detach();
+    });
 
     let (tx, rx) = channel();
     Thread::spawn(move || -> () {
@@ -47,7 +47,7 @@ fn main() {
             stream.read_byte();
             stream.write(&[2]);
         }
-    }).detach();
+    });
     let addr = rx.recv().unwrap();
 
     let (tx, rx) = channel();
@@ -64,7 +64,7 @@ fn main() {
                 Err(e) => debug!("{}", e)
             }
             tx.send(()).unwrap();
-        }).detach();
+        });
     }
 
     // Wait for all clients to exit, but don't wait for the server to exit. The
index bf108ecd6764a954e681940487786c1e78a21382..b931bd9609c6fde3fbfa64a369c9cf8d8bb23f1b 100644 (file)
@@ -42,7 +42,7 @@ fn test_rm_tempdir() {
         tx.send(tmp.path().clone()).unwrap();
         panic!("panic to unwind past `tmp`");
     };
-    let _ = Thread::spawn(f).join();
+    let _ = Thread::scoped(f).join();
     let path = rx.recv().unwrap();
     assert!(!path.exists());
 
@@ -52,7 +52,7 @@ fn test_rm_tempdir() {
         let _tmp = tmp;
         panic!("panic to unwind past `tmp`");
     };
-    let _ = Thread::spawn(f).join();
+    let _ = Thread::scoped(f).join();
     assert!(!path.exists());
 
     let path;
@@ -60,7 +60,7 @@ fn test_rm_tempdir() {
         let f = move|:| {
             TempDir::new("test_rm_tempdir").unwrap()
         };
-        let tmp = Thread::spawn(f).join().ok().expect("test_rm_tmdir");
+        let tmp = Thread::scoped(f).join().ok().expect("test_rm_tmdir");
         path = tmp.path().clone();
         assert!(path.exists());
     }
@@ -84,7 +84,7 @@ fn test_rm_tempdir_close() {
         tmp.close();
         panic!("panic when unwinding past `tmp`");
     };
-    let _ = Thread::spawn(f).join();
+    let _ = Thread::scoped(f).join();
     let path = rx.recv().unwrap();
     assert!(!path.exists());
 
@@ -95,7 +95,7 @@ fn test_rm_tempdir_close() {
         tmp.close();
         panic!("panic when unwinding past `tmp`");
     };
-    let _ = Thread::spawn(f).join();
+    let _ = Thread::scoped(f).join();
     assert!(!path.exists());
 
     let path;
@@ -103,7 +103,7 @@ fn test_rm_tempdir_close() {
         let f = move|:| {
             TempDir::new("test_rm_tempdir").unwrap()
         };
-        let tmp = Thread::spawn(f).join().ok().expect("test_rm_tmdir");
+        let tmp = Thread::scoped(f).join().ok().expect("test_rm_tmdir");
         path = tmp.path().clone();
         assert!(path.exists());
         tmp.close();
@@ -177,7 +177,7 @@ pub fn test_rmdir_recursive_ok() {
 }
 
 pub fn dont_double_panic() {
-    let r: Result<(), _> = Thread::spawn(move|| {
+    let r: Result<(), _> = Thread::scoped(move|| {
         let tmpdir = TempDir::new("test").unwrap();
         // Remove the temporary directory so that TempDir sees
         // an error on drop
index 4270ecc7450921713404b199c210dcccfdcc3da4..bfd1f5f4a74dd60ef6710a1a0df2615ee3206872 100644 (file)
 
 fn test_panic() {
     fn f() { let _x: Box<int> = panic!(); }
-    Thread::spawn(move|| f() ).join().err().unwrap();
+    Thread::scoped(move|| f() ).join().err().unwrap();
 }
 
 fn test_panic_indirect() {
     fn f() -> ! { panic!(); }
     fn g() { let _x: Box<int> = f(); }
-    Thread::spawn(move|| g() ).join().err().unwrap();
+    Thread::scoped(move|| g() ).join().err().unwrap();
 }
 
 pub fn main() {
index 02817a285ddf5bbd007d4105747ea72d74163dcf..c47ca0db2a15693d797a1de63f0ae549608f36a0 100644 (file)
@@ -13,7 +13,7 @@
 pub fn main() {
     let mut i = 10;
     while i > 0 {
-        Thread::spawn({let i = i; move|| child(i)}).detach();
+        Thread::spawn({let i = i; move|| child(i)});
         i = i - 1;
     }
     println!("main thread exiting");
index bd4143348b8867660d7af9c27fb86eb0e3d4cbfa..bb3019ede4b5764dc86547851f447ad7b1d36485 100644 (file)
@@ -23,7 +23,7 @@ pub fn main() {
         let tx = tx.clone();
         Thread::spawn(move|| {
             child(&tx, i)
-        }).detach();
+        });
         expected += i;
     }
 
index 9aeb5b10cf5f8d40b9b4c88639d48524fde69e6f..4c8665032828e50fbb93496e57621f7607eb7a37 100644 (file)
@@ -22,7 +22,7 @@ fn drop(&mut self) {
 }
 
 pub fn main() {
-    let x = Thread::spawn(move|| {
+    let x = Thread::scoped(move|| {
         let _b = Foo;
     }).join();
 
index bdd62995e0a31c5dd2cb58a9fd2951ec17e51fa9..29bf82a81d65da7949368c4fd0156b7511530596 100644 (file)
@@ -77,7 +77,7 @@ pub fn main() {
 
                 let v = main.clone();
 
-                let _ = Thread::spawn(move|| {
+                let _ = Thread::scoped(move|| {
                     let mut v = v;
                     let mut panic_countdown = panic_countdown;
                     v.as_mut_slice().sort_by(|a, b| {
index 9a96b483f2c92d3b3dec452fba69bfc9cff085ea..9ad6dd9d2b14213302d6f7e109e776f90d0832f0 100644 (file)
@@ -11,7 +11,7 @@
 use std::thread::Thread;
 
 pub fn main() {
-    let mut result = Thread::spawn(child);
+    let mut result = Thread::scoped(child);
     println!("1");
     Thread::yield_now();
     println!("2");
index 13119e5d909cd26b5e05e8b633e3e403bd668a93..3d3a36021da1569d405b95fbb4271f28ea9a7ced 100644 (file)
@@ -11,7 +11,7 @@
 use std::thread::Thread;
 
 pub fn main() {
-    let mut result = Thread::spawn(child);
+    let mut result = Thread::scoped(child);
     println!("1");
     Thread::yield_now();
     result.join();