@@ -43,6 +43,7 @@ use task::rt::{task_id, sched_id};
43
43
use util;
44
44
use util:: replace;
45
45
use unstable:: finally:: Finally ;
46
+ use rt:: { context, OldTaskContext } ;
46
47
47
48
#[ cfg( test) ] use comm:: SharedChan ;
48
49
@@ -558,23 +559,33 @@ pub fn get_scheduler() -> Scheduler {
558
559
* ~~~
559
560
*/
560
561
pub unsafe fn unkillable < U > ( f : & fn ( ) -> U ) -> U {
561
- let t = rt:: rust_get_task ( ) ;
562
- do ( || {
563
- rt:: rust_task_inhibit_kill ( t) ;
562
+ if context ( ) == OldTaskContext {
563
+ let t = rt:: rust_get_task ( ) ;
564
+ do ( || {
565
+ rt:: rust_task_inhibit_kill ( t) ;
566
+ f ( )
567
+ } ) . finally {
568
+ rt:: rust_task_allow_kill ( t) ;
569
+ }
570
+ } else {
571
+ // FIXME #6377
564
572
f ( )
565
- } ) . finally {
566
- rt:: rust_task_allow_kill ( t) ;
567
573
}
568
574
}
569
575
570
576
/// The inverse of unkillable. Only ever to be used nested in unkillable().
571
577
pub unsafe fn rekillable < U > ( f : & fn ( ) -> U ) -> U {
572
- let t = rt:: rust_get_task ( ) ;
573
- do ( || {
574
- rt:: rust_task_allow_kill ( t) ;
578
+ if context ( ) == OldTaskContext {
579
+ let t = rt:: rust_get_task ( ) ;
580
+ do ( || {
581
+ rt:: rust_task_allow_kill ( t) ;
582
+ f ( )
583
+ } ) . finally {
584
+ rt:: rust_task_inhibit_kill ( t) ;
585
+ }
586
+ } else {
587
+ // FIXME #6377
575
588
f ( )
576
- } ) . finally {
577
- rt:: rust_task_inhibit_kill ( t) ;
578
589
}
579
590
}
580
591
@@ -583,14 +594,19 @@ pub unsafe fn rekillable<U>(f: &fn() -> U) -> U {
583
594
* For use with exclusive ARCs, which use pthread mutexes directly.
584
595
*/
585
596
pub unsafe fn atomically < U > ( f : & fn ( ) -> U ) -> U {
586
- let t = rt:: rust_get_task ( ) ;
587
- do ( || {
588
- rt:: rust_task_inhibit_kill ( t) ;
589
- rt:: rust_task_inhibit_yield ( t) ;
597
+ if context ( ) == OldTaskContext {
598
+ let t = rt:: rust_get_task ( ) ;
599
+ do ( || {
600
+ rt:: rust_task_inhibit_kill ( t) ;
601
+ rt:: rust_task_inhibit_yield ( t) ;
602
+ f ( )
603
+ } ) . finally {
604
+ rt:: rust_task_allow_yield ( t) ;
605
+ rt:: rust_task_allow_kill ( t) ;
606
+ }
607
+ } else {
608
+ // FIXME #6377
590
609
f ( )
591
- } ) . finally {
592
- rt:: rust_task_allow_yield ( t) ;
593
- rt:: rust_task_allow_kill ( t) ;
594
610
}
595
611
}
596
612
0 commit comments