@@ -571,23 +571,29 @@ pub fn try<T:Owned>(f: fn~() -> T) -> Result<T,()> {
571
571
pub fn yield() {
572
572
//! Yield control to the task scheduler
573
573
574
- let task_ = rt::rust_get_task();
575
- let killed = rt::rust_task_yield(task_);
576
- if killed && !failing() {
577
- fail ~" killed";
574
+ unsafe {
575
+ let task_ = rt::rust_get_task();
576
+ let killed = rt::rust_task_yield(task_);
577
+ if killed && !failing() {
578
+ fail ~" killed";
579
+ }
578
580
}
579
581
}
580
582
581
583
pub fn failing( ) -> bool {
582
584
//! True if the running task has failed
583
585
584
- rt:: rust_task_is_unwinding( rt:: rust_get_task( ) )
586
+ unsafe {
587
+ rt:: rust_task_is_unwinding ( rt:: rust_get_task ( ) )
588
+ }
585
589
}
586
590
587
591
pub fn get_task ( ) -> Task {
588
592
//! Get a handle to the running task
589
593
590
- TaskHandle ( rt:: get_task_id( ) )
594
+ unsafe {
595
+ TaskHandle ( rt:: get_task_id ( ) )
596
+ }
591
597
}
592
598
593
599
/**
@@ -608,7 +614,11 @@ pub fn get_task() -> Task {
608
614
pub unsafe fn unkillable < U > ( f : fn ( ) -> U ) -> U {
609
615
struct AllowFailure {
610
616
t : * rust_task ,
611
- drop { rt : : rust_task_allow_kill( self . t) ; }
617
+ drop {
618
+ unsafe {
619
+ rt : : rust_task_allow_kill ( self . t) ;
620
+ }
621
+ }
612
622
}
613
623
614
624
fn AllowFailure ( t : * rust_task ) -> AllowFailure {
@@ -617,17 +627,23 @@ pub unsafe fn unkillable<U>(f: fn() -> U) -> U {
617
627
}
618
628
}
619
629
620
- let t = rt:: rust_get_task( ) ;
621
- let _allow_failure = AllowFailure ( t) ;
622
- rt:: rust_task_inhibit_kill( t) ;
623
- f( )
630
+ unsafe {
631
+ let t = rt:: rust_get_task ( ) ;
632
+ let _allow_failure = AllowFailure ( t) ;
633
+ rt:: rust_task_inhibit_kill ( t) ;
634
+ f ( )
635
+ }
624
636
}
625
637
626
638
/// The inverse of unkillable. Only ever to be used nested in unkillable().
627
639
pub unsafe fn rekillable < U > ( f : fn ( ) -> U ) -> U {
628
640
struct DisallowFailure {
629
641
t : * rust_task ,
630
- drop { rt : : rust_task_inhibit_kill( self . t) ; }
642
+ drop {
643
+ unsafe {
644
+ rt : : rust_task_inhibit_kill ( self . t) ;
645
+ }
646
+ }
631
647
}
632
648
633
649
fn DisallowFailure ( t : * rust_task ) -> DisallowFailure {
@@ -636,10 +652,12 @@ pub unsafe fn rekillable<U>(f: fn() -> U) -> U {
636
652
}
637
653
}
638
654
639
- let t = rt:: rust_get_task( ) ;
640
- let _allow_failure = DisallowFailure ( t) ;
641
- rt:: rust_task_allow_kill( t) ;
642
- f( )
655
+ unsafe {
656
+ let t = rt:: rust_get_task ( ) ;
657
+ let _allow_failure = DisallowFailure ( t) ;
658
+ rt:: rust_task_allow_kill ( t) ;
659
+ f ( )
660
+ }
643
661
}
644
662
645
663
/**
@@ -650,8 +668,10 @@ pub unsafe fn atomically<U>(f: fn() -> U) -> U {
650
668
struct DeferInterrupts {
651
669
t : * rust_task ,
652
670
drop {
653
- rt : : rust_task_allow_yield( self . t) ;
654
- rt:: rust_task_allow_kill( self . t) ;
671
+ unsafe {
672
+ rt : : rust_task_allow_yield ( self . t) ;
673
+ rt:: rust_task_allow_kill ( self . t) ;
674
+ }
655
675
}
656
676
}
657
677
@@ -661,11 +681,13 @@ pub unsafe fn atomically<U>(f: fn() -> U) -> U {
661
681
}
662
682
}
663
683
664
- let t = rt:: rust_get_task( ) ;
665
- let _interrupts = DeferInterrupts ( t) ;
666
- rt:: rust_task_inhibit_kill( t) ;
667
- rt:: rust_task_inhibit_yield( t) ;
668
- f( )
684
+ unsafe {
685
+ let t = rt:: rust_get_task ( ) ;
686
+ let _interrupts = DeferInterrupts ( t) ;
687
+ rt:: rust_task_inhibit_kill ( t) ;
688
+ rt:: rust_task_inhibit_yield ( t) ;
689
+ f ( )
690
+ }
669
691
}
670
692
671
693
#[ test] #[ should_fail] #[ ignore( cfg( windows) ) ]
@@ -908,18 +930,22 @@ fn test_spawn_sched() {
908
930
let ch = oldcomm:: Chan ( & po) ;
909
931
910
932
fn f( i: int, ch: oldcomm:: Chan <( ) >) {
911
- let parent_sched_id = rt:: rust_get_sched_id( ) ;
933
+ unsafe {
934
+ let parent_sched_id = rt:: rust_get_sched_id( ) ;
912
935
913
- do spawn_sched( SingleThreaded ) {
914
- let child_sched_id = rt:: rust_get_sched_id( ) ;
915
- assert parent_sched_id != child_sched_id;
916
-
917
- if ( i == 0 ) {
918
- oldcomm:: send( ch, ( ) ) ;
919
- } else {
920
- f( i - 1 , ch) ;
921
- }
922
- } ;
936
+ do spawn_sched( SingleThreaded ) {
937
+ unsafe {
938
+ let child_sched_id = rt:: rust_get_sched_id( ) ;
939
+ assert parent_sched_id != child_sched_id;
940
+
941
+ if ( i == 0 ) {
942
+ oldcomm:: send( ch, ( ) ) ;
943
+ } else {
944
+ f( i - 1 , ch) ;
945
+ }
946
+ }
947
+ } ;
948
+ }
923
949
924
950
}
925
951
f( 10 , ch) ;
@@ -932,13 +958,17 @@ fn test_spawn_sched_childs_on_same_sched() {
932
958
let ch = oldcomm:: Chan ( & po) ;
933
959
934
960
do spawn_sched( SingleThreaded ) {
935
- let parent_sched_id = rt:: rust_get_sched_id( ) ;
936
- do spawn {
937
- let child_sched_id = rt : : rust_get_sched_id( ) ;
938
- // This should be on the same scheduler
939
- assert parent_sched_id == child_sched_id;
940
- oldcomm:: send( ch, ( ) ) ;
941
- } ;
961
+ unsafe {
962
+ let parent_sched_id = rt:: rust_get_sched_id( ) ;
963
+ do spawn {
964
+ unsafe {
965
+ let child_sched_id = rt:: rust_get_sched_id( ) ;
966
+ // This should be on the same scheduler
967
+ assert parent_sched_id == child_sched_id;
968
+ oldcomm:: send( ch, ( ) ) ;
969
+ }
970
+ } ;
971
+ }
942
972
} ;
943
973
944
974
oldcomm:: recv( po) ;
@@ -1185,10 +1215,12 @@ fn test_sched_thread_per_core() {
1185
1215
let ( port, chan) = pipes:: stream( ) ;
1186
1216
1187
1217
do spawn_sched( ThreadPerCore ) |move chan| {
1188
- let cores = rt:: rust_num_threads( ) ;
1189
- let reported_threads = rt:: rust_sched_threads( ) ;
1190
- assert( cores as uint == reported_threads as uint) ;
1191
- chan. send( ( ) ) ;
1218
+ unsafe {
1219
+ let cores = rt:: rust_num_threads( ) ;
1220
+ let reported_threads = rt:: rust_sched_threads( ) ;
1221
+ assert( cores as uint == reported_threads as uint) ;
1222
+ chan. send( ( ) ) ;
1223
+ }
1192
1224
}
1193
1225
1194
1226
port. recv( ) ;
@@ -1199,22 +1231,24 @@ fn test_spawn_thread_on_demand() {
1199
1231
let ( port, chan) = pipes:: stream( ) ;
1200
1232
1201
1233
do spawn_sched( ManualThreads ( 2 ) ) |move chan| {
1202
- let max_threads = rt:: rust_sched_threads( ) ;
1203
- assert( max_threads as int == 2 ) ;
1204
- let running_threads = rt:: rust_sched_current_nonlazy_threads( ) ;
1205
- assert( running_threads as int == 1 ) ;
1234
+ unsafe {
1235
+ let max_threads = rt:: rust_sched_threads( ) ;
1236
+ assert( max_threads as int == 2 ) ;
1237
+ let running_threads = rt:: rust_sched_current_nonlazy_threads( ) ;
1238
+ assert( running_threads as int == 1 ) ;
1206
1239
1207
- let ( port2, chan2) = pipes:: stream( ) ;
1240
+ let ( port2, chan2) = pipes:: stream( ) ;
1208
1241
1209
- do spawn( ) |move chan2| {
1210
- chan2. send( ( ) ) ;
1211
- }
1242
+ do spawn( ) |move chan2| {
1243
+ chan2. send( ( ) ) ;
1244
+ }
1212
1245
1213
- let running_threads2 = rt:: rust_sched_current_nonlazy_threads( ) ;
1214
- assert( running_threads2 as int == 2 ) ;
1246
+ let running_threads2 = rt:: rust_sched_current_nonlazy_threads( ) ;
1247
+ assert( running_threads2 as int == 2 ) ;
1215
1248
1216
- port2. recv( ) ;
1217
- chan. send( ( ) ) ;
1249
+ port2. recv( ) ;
1250
+ chan. send( ( ) ) ;
1251
+ }
1218
1252
}
1219
1253
1220
1254
port. recv( ) ;
0 commit comments