about summary refs log tree commit diff
path: root/src/libstd/sys
diff options
context:
space:
mode:
authorAaron Turon <aturon@mozilla.com>2014-11-25 08:52:10 -0800
committerAaron Turon <aturon@mozilla.com>2014-12-18 23:31:35 -0800
commitcac133c9a86a4687755aeb44908e3fbb2bb35fc2 (patch)
tree91736549f0fd24edb154fa21a54d8bfdca418ef0 /src/libstd/sys
parent9b03b72d7fb82f07d35e7dcda02754c6da90ae58 (diff)
downloadrust-cac133c9a86a4687755aeb44908e3fbb2bb35fc2.tar.gz
rust-cac133c9a86a4687755aeb44908e3fbb2bb35fc2.zip
Introduce std::thread
Also removes:

* `std::task`
* `std::rt::task`
* `std::rt::thread`

Notes for the new API are in a follow-up commit.

Closes #18000
Diffstat (limited to 'src/libstd/sys')
-rw-r--r--src/libstd/sys/common/thread_info.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/libstd/sys/common/thread_info.rs b/src/libstd/sys/common/thread_info.rs
new file mode 100644
index 00000000000..fb0231b44ba
--- /dev/null
+++ b/src/libstd/sys/common/thread_info.rs
@@ -0,0 +1,60 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+struct ThreadInfo {
+    // This field holds the known bounds of the stack in (lo, hi)
+    // form. Not all threads necessarily know their precise bounds,
+    // hence this is optional.
+    stack_bounds: (uint, uint),
+    stack_guard: uint,
+    unwinder: Unwinder,
+    thread: Thread,
+}
+
+thread_local!(static THREAD_INFO: RefCell<Option<ThreadInfo>> = RefCell::new(None));
+
+impl ThreadInfo {
+    fn with<R>(f: |&ThreadInfo| -> R) -> R {
+        THREAD_INFO.with(|c| {
+            if c.borrow().is_none() {
+                *c.borrow_mut() = Some(ThreadInfo {
+                    stack_bounds: (0, 0),
+                    stack_guard: 0,
+                    unwinder: Unwinder::new(),
+                    thread: Thread::new(None),
+                })
+            }
+            f(c.borrow().as_ref().unwrap())
+        })
+    }
+}
+
+pub fn current_thread() -> Thread {
+    ThreadInfo::with(|info| info.thread.clone())
+}
+
+pub fn panicking() -> bool {
+    ThreadInfo::with(|info| info.unwinder.unwinding())
+}
+
+pub fn set(stack_bounds: (uint, uint), stack_guard: uint, thread: Thread) {
+    THREAD_INFO.with(|c| assert!(c.borrow().is_none()));
+    THREAD_INFO.with(|c| *c.borrow_mut() = Some(ThreadInfo{
+        stack_bounds: stack_bounds,
+        stack_guard: stack_guard,
+        unwinder: Unwinder::new(),
+        thread: thread,
+    }));
+}
+
+// a hack to get around privacy restrictions; implemented by `std::thread::Thread`
+pub trait NewThread {
+    fn new(name: Option<String>) -> Self;
+}