Skip to content

Commit 06f1a64

Browse files
committed
core::rt: Convert users of local_sched to Local trait
1 parent 18fab45 commit 06f1a64

File tree

10 files changed

+143
-145
lines changed

10 files changed

+143
-145
lines changed

src/libcore/rt/comm.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ use cast;
2020
use util;
2121
use ops::Drop;
2222
use kinds::Owned;
23-
use rt::sched::Coroutine;
23+
use rt::sched::{Scheduler, Coroutine};
24+
use rt::local::Local;
2425
use rt::local_sched;
2526
use unstable::intrinsics::{atomic_xchg, atomic_load};
2627
use util::Void;
@@ -127,7 +128,7 @@ impl<T> ChanOne<T> {
127128
task_as_state => {
128129
// Port is blocked. Wake it up.
129130
let recvr: ~Coroutine = cast::transmute(task_as_state);
130-
let sched = local_sched::take();
131+
let sched = Local::take::<Scheduler>();
131132
sched.schedule_task(recvr);
132133
}
133134
}
@@ -157,7 +158,7 @@ impl<T> PortOne<T> {
157158
// XXX: Optimize this to not require the two context switches when data is available
158159

159160
// Switch to the scheduler to put the ~Task into the Packet state.
160-
let sched = local_sched::take();
161+
let sched = Local::take::<Scheduler>();
161162
do sched.deschedule_running_task_and_then |task| {
162163
unsafe {
163164
// Atomically swap the task pointer into the Packet state, issuing
@@ -173,7 +174,7 @@ impl<T> PortOne<T> {
173174
STATE_ONE => {
174175
// Channel is closed. Switch back and check the data.
175176
let task: ~Coroutine = cast::transmute(task_as_state);
176-
let sched = local_sched::take();
177+
let sched = Local::take::<Scheduler>();
177178
sched.resume_task_immediately(task);
178179
}
179180
_ => util::unreachable()
@@ -239,7 +240,7 @@ impl<T> Drop for ChanOneHack<T> {
239240
// The port is blocked waiting for a message we will never send. Wake it.
240241
assert!((*this.packet()).payload.is_none());
241242
let recvr: ~Coroutine = cast::transmute(task_as_state);
242-
let sched = local_sched::take();
243+
let sched = Local::take::<Scheduler>();
243244
sched.schedule_task(recvr);
244245
}
245246
}

src/libcore/rt/local.rs

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,51 @@ use rt::sched::Scheduler;
1212
use rt::local_ptr;
1313

1414
pub trait Local {
15-
fn put_local(value: ~Self);
16-
fn take_local() -> ~Self;
17-
fn exists_local() -> bool;
18-
fn borrow_local(f: &fn(&mut Self));
19-
unsafe fn unsafe_borrow_local() -> *mut Self;
15+
fn put(value: ~Self);
16+
fn take() -> ~Self;
17+
fn exists() -> bool;
18+
fn borrow(f: &fn(&mut Self));
19+
unsafe fn unsafe_borrow() -> *mut Self;
2020
}
2121

2222
impl Local for Scheduler {
23-
fn put_local(value: ~Scheduler) { unsafe { local_ptr::put(value) }}
24-
fn take_local() -> ~Scheduler { unsafe { local_ptr::take() } }
25-
fn exists_local() -> bool { local_ptr::exists() }
26-
fn borrow_local(f: &fn(&mut Scheduler)) { unsafe { local_ptr::borrow(f) } }
27-
unsafe fn unsafe_borrow_local() -> *mut Scheduler { local_ptr::unsafe_borrow() }
23+
fn put(value: ~Scheduler) { unsafe { local_ptr::put(value) }}
24+
fn take() -> ~Scheduler { unsafe { local_ptr::take() } }
25+
fn exists() -> bool { local_ptr::exists() }
26+
fn borrow(f: &fn(&mut Scheduler)) { unsafe { local_ptr::borrow(f) } }
27+
unsafe fn unsafe_borrow() -> *mut Scheduler { local_ptr::unsafe_borrow() }
28+
}
29+
30+
#[cfg(test)]
31+
mod test {
32+
use rt::sched::Scheduler;
33+
use rt::uv::uvio::UvEventLoop;
34+
use super::*;
35+
36+
#[test]
37+
fn thread_local_scheduler_smoke_test() {
38+
let scheduler = ~UvEventLoop::new_scheduler();
39+
Local::put(scheduler);
40+
let _scheduler: ~Scheduler = Local::take();
41+
}
42+
43+
#[test]
44+
fn thread_local_scheduler_two_instances() {
45+
let scheduler = ~UvEventLoop::new_scheduler();
46+
Local::put(scheduler);
47+
let _scheduler: ~Scheduler = Local::take();
48+
let scheduler = ~UvEventLoop::new_scheduler();
49+
Local::put(scheduler);
50+
let _scheduler: ~Scheduler = Local::take();
51+
}
52+
53+
#[test]
54+
fn borrow_smoke_test() {
55+
let scheduler = ~UvEventLoop::new_scheduler();
56+
Local::put(scheduler);
57+
unsafe {
58+
let _scheduler: *mut Scheduler = Local::unsafe_borrow();
59+
}
60+
let _scheduler: ~Scheduler = Local::take();
61+
}
2862
}

src/libcore/rt/local_sched.rs

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -25,56 +25,8 @@ use rt::local::Local;
2525

2626
#[cfg(test)] use rt::uv::uvio::UvEventLoop;
2727

28-
/// Give the Scheduler to thread-local storage
29-
pub fn put(sched: ~Scheduler) { Local::put_local(sched) }
30-
31-
/// Take ownership of the Scheduler from thread-local storage
32-
pub fn take() -> ~Scheduler { Local::take_local() }
33-
34-
/// Check whether there is a thread-local Scheduler attached to the running thread
35-
pub fn exists() -> bool { Local::exists_local::<Scheduler>() }
36-
37-
/// Borrow the thread-local scheduler from thread-local storage.
38-
/// While the scheduler is borrowed it is not available in TLS.
39-
pub fn borrow(f: &fn(&mut Scheduler)) { Local::borrow_local(f) }
40-
41-
/// Borrow a mutable reference to the thread-local Scheduler
42-
///
43-
/// # Safety Note
44-
///
45-
/// Because this leaves the Scheduler in thread-local storage it is possible
46-
/// For the Scheduler pointer to be aliased
47-
pub unsafe fn unsafe_borrow() -> *mut Scheduler { Local::unsafe_borrow_local() }
48-
4928
pub unsafe fn unsafe_borrow_io() -> *mut IoFactoryObject {
50-
let sched = unsafe_borrow();
29+
let sched = Local::unsafe_borrow::<Scheduler>();
5130
let io: *mut IoFactoryObject = (*sched).event_loop.io().unwrap();
5231
return io;
5332
}
54-
55-
#[test]
56-
fn thread_local_scheduler_smoke_test() {
57-
let scheduler = ~UvEventLoop::new_scheduler();
58-
put(scheduler);
59-
let _scheduler = take();
60-
}
61-
62-
#[test]
63-
fn thread_local_scheduler_two_instances() {
64-
let scheduler = ~UvEventLoop::new_scheduler();
65-
put(scheduler);
66-
let _scheduler = take();
67-
let scheduler = ~UvEventLoop::new_scheduler();
68-
put(scheduler);
69-
let _scheduler = take();
70-
}
71-
72-
#[test]
73-
fn borrow_smoke_test() {
74-
let scheduler = ~UvEventLoop::new_scheduler();
75-
put(scheduler);
76-
unsafe {
77-
let _scheduler = unsafe_borrow();
78-
}
79-
let _scheduler = take();
80-
}

src/libcore/rt/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,16 +188,17 @@ pub enum RuntimeContext {
188188
pub fn context() -> RuntimeContext {
189189

190190
use task::rt::rust_task;
191-
use self::sched::local_sched;
191+
use self::local::Local;
192+
use self::sched::{local_sched, Scheduler};
192193

193194
// XXX: Hitting TLS twice to check if the scheduler exists
194195
// then to check for the task is not good for perf
195196
if unsafe { rust_try_get_task().is_not_null() } {
196197
return OldTaskContext;
197198
} else {
198-
if local_sched::exists() {
199+
if Local::exists::<Scheduler>() {
199200
let context = ::cell::empty_cell();
200-
do local_sched::borrow |sched| {
201+
do Local::borrow::<Scheduler> |sched| {
201202
if sched.in_task_context() {
202203
context.put_back(TaskContext);
203204
} else {
@@ -219,21 +220,22 @@ pub fn context() -> RuntimeContext {
219220
#[test]
220221
fn test_context() {
221222
use unstable::run_in_bare_thread;
222-
use self::sched::{local_sched, Coroutine};
223+
use self::sched::{local_sched, Scheduler, Coroutine};
223224
use rt::uv::uvio::UvEventLoop;
224225
use cell::Cell;
226+
use rt::local::Local;
225227

226228
assert_eq!(context(), OldTaskContext);
227229
do run_in_bare_thread {
228230
assert_eq!(context(), GlobalContext);
229231
let mut sched = ~UvEventLoop::new_scheduler();
230232
let task = ~do Coroutine::new(&mut sched.stack_pool) {
231233
assert_eq!(context(), TaskContext);
232-
let sched = local_sched::take();
234+
let sched = Local::take::<Scheduler>();
233235
do sched.deschedule_running_task_and_then() |task| {
234236
assert_eq!(context(), SchedulerContext);
235237
let task = Cell(task);
236-
do local_sched::borrow |sched| {
238+
do Local::borrow::<Scheduler> |sched| {
237239
sched.enqueue_task(task.take());
238240
}
239241
}

0 commit comments

Comments
 (0)