Skip to content

Commit 1f8ebb6

Browse files
committed
core::rt: Move thread-local scheduler to its own module
1 parent 4f1dd1f commit 1f8ebb6

File tree

3 files changed

+109
-99
lines changed

3 files changed

+109
-99
lines changed

src/libcore/rt/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ macro_rules! rtdebug (
3232
($( $arg:expr),+) => ( $(let _ = $arg)*; )
3333
)
3434

35+
#[path = "sched/mod.rs"]
3536
mod sched;
3637
mod rtio;
3738
pub mod uvll;

src/libcore/rt/sched/local.rs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
//! Access to the thread-local Scheduler
12+
13+
use ptr::mut_null;
14+
use libc::c_void;
15+
use cast::transmute;
16+
17+
use super::Scheduler;
18+
use tls = super::super::thread_local_storage;
19+
#[cfg(test)] use super::super::uvio::UvEventLoop;
20+
21+
/// Give the Scheduler to thread-local storage
22+
pub fn put(sched: ~Scheduler) {
23+
unsafe {
24+
let key = tls_key();
25+
let void_sched: *mut c_void = transmute::<~Scheduler, *mut c_void>(sched);
26+
tls::set(key, void_sched);
27+
}
28+
}
29+
30+
/// Take ownership of the Scheduler from thread-local storage
31+
pub fn take() -> ~Scheduler {
32+
unsafe {
33+
let key = tls_key();
34+
let void_sched: *mut c_void = tls::get(key);
35+
assert!(void_sched.is_not_null());
36+
let sched = transmute::<*mut c_void, ~Scheduler>(void_sched);
37+
tls::set(key, mut_null());
38+
return sched;
39+
}
40+
}
41+
42+
/// Give the Scheduler to thread-local storage for the duration of the block
43+
pub fn install(sched: ~Scheduler, f: &fn()) -> ~Scheduler {
44+
put(sched);
45+
f();
46+
return take();
47+
}
48+
49+
/// Borrow a mutable reference to the thread-local Scheduler
50+
/// # Safety Note
51+
/// Because this leaves the Scheduler in thread-local storage it is possible
52+
/// For the Scheduler pointer to be aliased
53+
pub fn borrow(f: &fn(&mut Scheduler)) {
54+
unsafe {
55+
let key = tls_key();
56+
let mut void_sched: *mut c_void = tls::get(key);
57+
assert!(void_sched.is_not_null());
58+
{
59+
let void_sched_ptr = &mut void_sched;
60+
let sched: &mut ~Scheduler = {
61+
transmute::<&mut *mut c_void, &mut ~Scheduler>(void_sched_ptr)
62+
};
63+
let sched: &mut Scheduler = &mut **sched;
64+
f(sched);
65+
}
66+
}
67+
}
68+
69+
fn tls_key() -> tls::Key {
70+
unsafe {
71+
let key: *mut c_void = rust_get_sched_tls_key();
72+
let key: &mut tls::Key = transmute(key);
73+
return *key;
74+
}
75+
}
76+
77+
extern {
78+
fn rust_get_sched_tls_key() -> *mut c_void;
79+
}
80+
81+
#[test]
82+
fn thread_local_scheduler_smoke_test() {
83+
let scheduler = ~UvEventLoop::new_scheduler();
84+
put(scheduler);
85+
let _scheduler = take();
86+
}
87+
88+
#[test]
89+
fn thread_local_scheduler_two_instances() {
90+
let scheduler = ~UvEventLoop::new_scheduler();
91+
put(scheduler);
92+
let _scheduler = take();
93+
let scheduler = ~UvEventLoop::new_scheduler();
94+
put(scheduler);
95+
let _scheduler = take();
96+
}
97+
98+
#[test]
99+
fn install_borrow_smoke_test() {
100+
let scheduler = ~UvEventLoop::new_scheduler();
101+
let _scheduler = do install(scheduler) {
102+
do borrow |_sched| {
103+
}
104+
};
105+
}
106+

src/libcore/rt/sched.rs renamed to src/libcore/rt/sched/mod.rs

Lines changed: 2 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use super::context::Context;
2121
#[cfg(test)] use unstable::run_in_bare_thread;
2222
#[cfg(test)] use int;
2323

24+
mod local;
25+
2426
/// The Scheduler is responsible for coordinating execution of Tasks
2527
/// on a single thread. When the scheduler is running it is owned by
2628
/// thread local storage and the running task is owned by the
@@ -350,105 +352,6 @@ pub impl Task {
350352
}
351353
}
352354

353-
mod local {
354-
355-
//! Access to the thread-local Scheduler
356-
357-
use ptr::mut_null;
358-
use libc::c_void;
359-
use cast::transmute;
360-
361-
use super::Scheduler;
362-
use tls = super::super::thread_local_storage;
363-
#[cfg(test)] use super::super::uvio::UvEventLoop;
364-
365-
/// Give the Scheduler to thread-local storage
366-
pub fn put(sched: ~Scheduler) {
367-
unsafe {
368-
let key = tls_key();
369-
let void_sched: *mut c_void = transmute::<~Scheduler, *mut c_void>(sched);
370-
tls::set(key, void_sched);
371-
}
372-
}
373-
374-
/// Take ownership of the Scheduler from thread-local storage
375-
pub fn take() -> ~Scheduler {
376-
unsafe {
377-
let key = tls_key();
378-
let void_sched: *mut c_void = tls::get(key);
379-
assert!(void_sched.is_not_null());
380-
let sched = transmute::<*mut c_void, ~Scheduler>(void_sched);
381-
tls::set(key, mut_null());
382-
return sched;
383-
}
384-
}
385-
386-
/// Give the Scheduler to thread-local storage for the duration of the block
387-
pub fn install(sched: ~Scheduler, f: &fn()) -> ~Scheduler {
388-
put(sched);
389-
f();
390-
return take();
391-
}
392-
393-
/// Borrow a mutable reference to the thread-local Scheduler
394-
/// # Safety Note
395-
/// Because this leaves the Scheduler in thread-local storage it is possible
396-
/// For the Scheduler pointer to be aliased
397-
pub fn borrow(f: &fn(&mut Scheduler)) {
398-
unsafe {
399-
let key = tls_key();
400-
let mut void_sched: *mut c_void = tls::get(key);
401-
assert!(void_sched.is_not_null());
402-
{
403-
let void_sched_ptr = &mut void_sched;
404-
let sched: &mut ~Scheduler = {
405-
transmute::<&mut *mut c_void, &mut ~Scheduler>(void_sched_ptr)
406-
};
407-
let sched: &mut Scheduler = &mut **sched;
408-
f(sched);
409-
}
410-
}
411-
}
412-
413-
fn tls_key() -> tls::Key {
414-
unsafe {
415-
let key: *mut c_void = rust_get_sched_tls_key();
416-
let key: &mut tls::Key = transmute(key);
417-
return *key;
418-
}
419-
}
420-
421-
extern {
422-
fn rust_get_sched_tls_key() -> *mut c_void;
423-
}
424-
425-
#[test]
426-
fn thread_local_scheduler_smoke_test() {
427-
let scheduler = ~UvEventLoop::new_scheduler();
428-
put(scheduler);
429-
let _scheduler = take();
430-
}
431-
432-
#[test]
433-
fn thread_local_scheduler_two_instances() {
434-
let scheduler = ~UvEventLoop::new_scheduler();
435-
put(scheduler);
436-
let _scheduler = take();
437-
let scheduler = ~UvEventLoop::new_scheduler();
438-
put(scheduler);
439-
let _scheduler = take();
440-
}
441-
442-
#[test]
443-
fn install_borrow_smoke_test() {
444-
let scheduler = ~UvEventLoop::new_scheduler();
445-
let _scheduler = do install(scheduler) {
446-
do borrow |_sched| {
447-
}
448-
};
449-
}
450-
}
451-
452355
#[test]
453356
fn test_simple_scheduling() {
454357
do run_in_bare_thread {

0 commit comments

Comments
 (0)