diff options
| author | bors <bors@rust-lang.org> | 2013-04-30 20:09:36 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-04-30 20:09:36 -0700 |
| commit | c1ea72d88fb9739ae82a6e5a2f0bf9bbf9838558 (patch) | |
| tree | 894737eb63086f90a147ccd4036c1462d1f9a36e /src/libcore/task | |
| parent | cb527bff09e057ff6eeefe893c44e19b9d29a920 (diff) | |
| parent | c1fdace588034ae76f7ccb920ddadd9c2722a5cd (diff) | |
| download | rust-c1ea72d88fb9739ae82a6e5a2f0bf9bbf9838558.tar.gz rust-c1ea72d88fb9739ae82a6e5a2f0bf9bbf9838558.zip | |
auto merge of #6113 : brson/rust/task-drop, r=graydon
Diffstat (limited to 'src/libcore/task')
| -rw-r--r-- | src/libcore/task/mod.rs | 77 |
1 files changed, 21 insertions, 56 deletions
diff --git a/src/libcore/task/mod.rs b/src/libcore/task/mod.rs index 96429932b18..2a4817727f4 100644 --- a/src/libcore/task/mod.rs +++ b/src/libcore/task/mod.rs @@ -42,6 +42,7 @@ use result; use task::rt::{task_id, sched_id, rust_task}; use util; use util::replace; +use unstable::finally::Finally; #[cfg(test)] use comm::SharedChan; @@ -591,48 +592,24 @@ pub fn get_scheduler() -> Scheduler { * ~~~ */ pub unsafe fn unkillable<U>(f: &fn() -> U) -> U { - 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() + do (|| { + rt::rust_task_inhibit_kill(t); + f() + }).finally { + rt::rust_task_allow_kill(t); + } } /// The inverse of unkillable. Only ever to be used nested in unkillable(). pub unsafe fn rekillable<U>(f: &fn() -> U) -> U { - 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() + do (|| { + rt::rust_task_allow_kill(t); + f() + }).finally { + rt::rust_task_inhibit_kill(t); + } } /** @@ -640,27 +617,15 @@ 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 { - 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() + do (|| { + rt::rust_task_inhibit_kill(t); + rt::rust_task_inhibit_yield(t); + f() + }).finally { + rt::rust_task_allow_yield(t); + rt::rust_task_allow_kill(t); + } } #[test] #[should_fail] #[ignore(cfg(windows))] |
