diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-08-10 20:06:39 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-08-27 21:29:11 -0700 |
| commit | 06a7195e9e9cea81854c39ce2c1376fe588bc1b0 (patch) | |
| tree | f71efbc05e978adb420e11fadd397a41683e379f /src/libstd/rt/task.rs | |
| parent | 578e68047736167239c52fa1aba0347011ff1bc3 (diff) | |
| download | rust-06a7195e9e9cea81854c39ce2c1376fe588bc1b0.tar.gz rust-06a7195e9e9cea81854c39ce2c1376fe588bc1b0.zip | |
Consolidate local_data implementations, and cleanup
This moves all local_data stuff into the `local_data` module and only that module alone. It also removes a fair amount of "super-unsafe" code in favor of just vanilla code generated by the compiler at the same time. Closes #8113
Diffstat (limited to 'src/libstd/rt/task.rs')
| -rw-r--r-- | src/libstd/rt/task.rs | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs index b1ab7a6cd5d..da81aab0f78 100644 --- a/src/libstd/rt/task.rs +++ b/src/libstd/rt/task.rs @@ -16,8 +16,8 @@ use borrow; use cast::transmute; use cleanup; +use local_data; use libc::{c_void, uintptr_t}; -use ptr; use prelude::*; use option::{Option, Some, None}; use rt::borrowck; @@ -80,7 +80,7 @@ pub enum SchedHome { } pub struct GarbageCollector; -pub struct LocalStorage(*c_void, Option<extern "Rust" fn(*c_void)>); +pub struct LocalStorage(Option<local_data::Map>); pub struct Unwinder { unwinding: bool, @@ -130,7 +130,7 @@ impl Task { Task { heap: LocalHeap::new(), gc: GarbageCollector, - storage: LocalStorage(ptr::null(), None), + storage: LocalStorage(None), logger: StdErrLogger, unwinder: Unwinder { unwinding: false }, taskgroup: None, @@ -164,7 +164,7 @@ impl Task { Task { heap: LocalHeap::new(), gc: GarbageCollector, - storage: LocalStorage(ptr::null(), None), + storage: LocalStorage(None), logger: StdErrLogger, unwinder: Unwinder { unwinding: false }, taskgroup: None, @@ -186,7 +186,7 @@ impl Task { Task { heap: LocalHeap::new(), gc: GarbageCollector, - storage: LocalStorage(ptr::null(), None), + storage: LocalStorage(None), logger: StdErrLogger, unwinder: Unwinder { unwinding: false }, taskgroup: None, @@ -233,15 +233,8 @@ impl Task { // Run the task main function, then do some cleanup. do f.finally { - - // Destroy task-local storage. This may run user dtors. - match self.storage { - LocalStorage(ptr, Some(ref dtor)) => { - (*dtor)(ptr) - } - _ => () - } - + // First, destroy task-local storage. This may run user dtors. + // // FIXME #8302: Dear diary. I'm so tired and confused. // There's some interaction in rustc between the box // annihilator and the TLS dtor by which TLS is @@ -253,7 +246,13 @@ impl Task { // TLS would be reinitialized but never destroyed, // but somehow this works. I have no idea what's going // on but this seems to make things magically work. FML. - self.storage = LocalStorage(ptr::null(), None); + // + // (added after initial comment) A possible interaction here is + // that the destructors for the objects in TLS themselves invoke + // TLS, or possibly some destructors for those objects being + // annihilated invoke TLS. Sadly these two operations seemed to + // be intertwined, and miraculously work for now... + self.storage.take(); // Destroy remaining boxes. Also may run user dtors. unsafe { cleanup::annihilate(); } |
