diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-04-09 01:31:23 -0400 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-04-14 01:15:46 -0400 |
| commit | d9595d1737677dd61d9f52f674c34f13d708e39c (patch) | |
| tree | 304855240a098090a217dc325c4ca377b31d9ba2 /src/libcore/task | |
| parent | 4bfa3c6663ad6facdbdb8bd533442b050085f753 (diff) | |
| download | rust-d9595d1737677dd61d9f52f674c34f13d708e39c.tar.gz rust-d9595d1737677dd61d9f52f674c34f13d708e39c.zip | |
core: remove unnecessary unsafe blocks/functions
Diffstat (limited to 'src/libcore/task')
| -rw-r--r-- | src/libcore/task/mod.rs | 79 | ||||
| -rw-r--r-- | src/libcore/task/spawn.rs | 4 |
2 files changed, 56 insertions, 27 deletions
diff --git a/src/libcore/task/mod.rs b/src/libcore/task/mod.rs index e4ee430cdda..d712bf8f98f 100644 --- a/src/libcore/task/mod.rs +++ b/src/libcore/task/mod.rs @@ -39,10 +39,9 @@ use result::Result; use comm::{stream, Chan, GenericChan, GenericPort, Port}; use prelude::*; use result; -use task::rt::{task_id, sched_id}; +use task::rt::{task_id, sched_id, rust_task}; use util; use util::replace; -use unstable::finally::Finally; #[cfg(test)] use comm::SharedChan; @@ -566,28 +565,48 @@ pub fn get_scheduler() -> Scheduler { * ~~~ */ pub unsafe fn unkillable<U>(f: &fn() -> U) -> U { - unsafe { - let t = rt::rust_get_task(); - rt::rust_task_inhibit_kill(t); - do (|| { - f() - }).finally { - rt::rust_task_allow_kill(t); + struct AllowFailure { + t: *rust_task, + drop { + unsafe { + rt::rust_task_allow_kill(self.t); + } + } + } + + fn AllowFailure(t: *rust_task) -> AllowFailure{ + AllowFailure { + t: t } } + + let t = rt::rust_get_task(); + let _allow_failure = AllowFailure(t); + rt::rust_task_inhibit_kill(t); + f() } /// The inverse of unkillable. Only ever to be used nested in unkillable(). pub unsafe fn rekillable<U>(f: &fn() -> U) -> U { - unsafe { - let t = rt::rust_get_task(); - rt::rust_task_allow_kill(t); - do (|| { - f() - }).finally { - rt::rust_task_inhibit_kill(t); + struct DisallowFailure { + t: *rust_task, + drop { + unsafe { + rt::rust_task_inhibit_kill(self.t); + } } } + + fn DisallowFailure(t: *rust_task) -> DisallowFailure { + DisallowFailure { + t: t + } + } + + let t = rt::rust_get_task(); + let _allow_failure = DisallowFailure(t); + rt::rust_task_allow_kill(t); + f() } /** @@ -595,17 +614,27 @@ pub unsafe fn rekillable<U>(f: &fn() -> U) -> U { * For use with exclusive ARCs, which use pthread mutexes directly. */ pub unsafe fn atomically<U>(f: &fn() -> U) -> U { - unsafe { - let t = rt::rust_get_task(); - rt::rust_task_inhibit_kill(t); - rt::rust_task_inhibit_yield(t); - do (|| { - f() - }).finally { - rt::rust_task_allow_yield(t); - rt::rust_task_allow_kill(t); + struct DeferInterrupts { + t: *rust_task, + drop { + unsafe { + rt::rust_task_allow_yield(self.t); + rt::rust_task_allow_kill(self.t); + } } } + + fn DeferInterrupts(t: *rust_task) -> DeferInterrupts { + DeferInterrupts { + t: t + } + } + + let t = rt::rust_get_task(); + let _interrupts = DeferInterrupts(t); + rt::rust_task_inhibit_kill(t); + rt::rust_task_inhibit_yield(t); + f() } #[test] #[should_fail] #[ignore(cfg(windows))] diff --git a/src/libcore/task/spawn.rs b/src/libcore/task/spawn.rs index e1b645cd562..c71f7d26d40 100644 --- a/src/libcore/task/spawn.rs +++ b/src/libcore/task/spawn.rs @@ -157,13 +157,13 @@ struct AncestorList(Option<unstable::Exclusive<AncestorNode>>); // Accessors for taskgroup arcs and ancestor arcs that wrap the unsafety. #[inline(always)] fn access_group<U>(x: &TaskGroupArc, blk: &fn(TaskGroupInner) -> U) -> U { - unsafe { x.with(blk) } + x.with(blk) } #[inline(always)] fn access_ancestors<U>(x: &unstable::Exclusive<AncestorNode>, blk: &fn(x: &mut AncestorNode) -> U) -> U { - unsafe { x.with(blk) } + x.with(blk) } // Iterates over an ancestor list. |
