@@ -42,6 +42,7 @@ use result;
42
42
use task:: rt:: { task_id, sched_id, rust_task} ;
43
43
use util;
44
44
use util:: replace;
45
+ use unstable:: finally:: Finally ;
45
46
46
47
#[ cfg( test) ] use comm:: SharedChan ;
47
48
@@ -591,76 +592,40 @@ pub fn get_scheduler() -> Scheduler {
591
592
* ~~~
592
593
*/
593
594
pub unsafe fn unkillable<U>(f: &fn() -> U) -> U {
594
- struct AllowFailure {
595
- t: *rust_task,
596
- drop {
597
- unsafe {
598
- rt::rust_task_allow_kill(self.t);
599
- }
600
- }
601
- }
602
-
603
- fn AllowFailure(t: *rust_task) -> AllowFailure{
604
- AllowFailure {
605
- t: t
606
- }
607
- }
608
-
609
595
let t = rt::rust_get_task();
610
- let _allow_failure = AllowFailure(t);
611
- rt::rust_task_inhibit_kill(t);
612
- f()
596
+ do (|| {
597
+ rt::rust_task_inhibit_kill(t);
598
+ f()
599
+ }).finally {
600
+ rt::rust_task_allow_kill(t);
601
+ }
613
602
}
614
603
615
604
/// The inverse of unkillable. Only ever to be used nested in unkillable().
616
605
pub unsafe fn rekillable<U>(f: &fn() -> U) -> U {
617
- struct DisallowFailure {
618
- t: *rust_task,
619
- drop {
620
- unsafe {
621
- rt::rust_task_inhibit_kill(self.t);
622
- }
623
- }
624
- }
625
-
626
- fn DisallowFailure(t: *rust_task) -> DisallowFailure {
627
- DisallowFailure {
628
- t: t
629
- }
630
- }
631
-
632
606
let t = rt::rust_get_task();
633
- let _allow_failure = DisallowFailure(t);
634
- rt::rust_task_allow_kill(t);
635
- f()
607
+ do (|| {
608
+ rt::rust_task_allow_kill(t);
609
+ f()
610
+ }).finally {
611
+ rt::rust_task_inhibit_kill(t);
612
+ }
636
613
}
637
614
638
615
/**
639
616
* A stronger version of unkillable that also inhibits scheduling operations.
640
617
* For use with exclusive ARCs, which use pthread mutexes directly.
641
618
*/
642
619
pub unsafe fn atomically<U>(f: &fn() -> U) -> U {
643
- struct DeferInterrupts {
644
- t: *rust_task,
645
- drop {
646
- unsafe {
647
- rt::rust_task_allow_yield(self.t);
648
- rt::rust_task_allow_kill(self.t);
649
- }
650
- }
651
- }
652
-
653
- fn DeferInterrupts(t: *rust_task) -> DeferInterrupts {
654
- DeferInterrupts {
655
- t: t
656
- }
657
- }
658
-
659
620
let t = rt::rust_get_task();
660
- let _interrupts = DeferInterrupts(t);
661
- rt::rust_task_inhibit_kill(t);
662
- rt::rust_task_inhibit_yield(t);
663
- f()
621
+ do (|| {
622
+ rt::rust_task_inhibit_kill(t);
623
+ rt::rust_task_inhibit_yield(t);
624
+ f()
625
+ }).finally {
626
+ rt::rust_task_allow_yield(t);
627
+ rt::rust_task_allow_kill(t);
628
+ }
664
629
}
665
630
666
631
#[test] #[should_fail] #[ignore(cfg(windows))]
0 commit comments