Skip to content

Commit 574589b

Browse files
committed
---
yaml --- r: 142582 b: refs/heads/try2 c: ed8c359 h: refs/heads/master v: v3
1 parent fba5925 commit 574589b

File tree

5 files changed

+32
-6
lines changed

5 files changed

+32
-6
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: dec9db10da062b1c528d46426d9f62e201d39bc6
8+
refs/heads/try2: ed8c3594bc86dd366e729d02c34915c783e6ac81
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/rt/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,14 @@ pub fn start(_argc: int, _argv: **u8, crate_map: *u8, main: ~fn()) -> int {
150150
use self::sched::{Scheduler, Coroutine};
151151
use self::work_queue::WorkQueue;
152152
use self::uv::uvio::UvEventLoop;
153+
use self::sleeper_list::SleeperList;
153154

154155
init(crate_map);
155156

156157
let loop_ = ~UvEventLoop::new();
157158
let work_queue = WorkQueue::new();
158-
let mut sched = ~Scheduler::new(loop_, work_queue);
159+
let sleepers = SleeperList::new();
160+
let mut sched = ~Scheduler::new(loop_, work_queue, sleepers);
159161
let main_task = ~Coroutine::new(&mut sched.stack_pool, main);
160162

161163
sched.enqueue_task(main_task);

branches/try2/src/libcore/rt/sched.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use sys;
1313
use cast::transmute;
1414
use cell::Cell;
1515

16+
use super::sleeper_list::SleeperList;
1617
use super::work_queue::WorkQueue;
1718
use super::stack::{StackPool, StackSegment};
1819
use super::rtio::{EventLoop, EventLoopObject, RemoteCallbackObject};
@@ -27,7 +28,12 @@ use rt::rtio::IoFactoryObject;
2728
/// thread local storage and the running task is owned by the
2829
/// scheduler.
2930
pub struct Scheduler {
31+
/// A queue of available work. Under a work-stealing policy there
32+
/// is one per Scheduler.
3033
priv work_queue: WorkQueue<~Coroutine>,
34+
/// A shared list of sleeping schedulers. We'll use this to wake
35+
/// up schedulers when pushing work onto the work queue.
36+
priv sleeper_list: SleeperList,
3137
stack_pool: StackPool,
3238
/// The event loop used to drive the scheduler and perform I/O
3339
event_loop: ~EventLoopObject,
@@ -65,12 +71,16 @@ pub impl Scheduler {
6571

6672
fn in_task_context(&self) -> bool { self.current_task.is_some() }
6773

68-
fn new(event_loop: ~EventLoopObject, work_queue: WorkQueue<~Coroutine>) -> Scheduler {
74+
fn new(event_loop: ~EventLoopObject,
75+
work_queue: WorkQueue<~Coroutine>,
76+
sleeper_list: SleeperList)
77+
-> Scheduler {
6978

7079
// Lazily initialize the runtime TLS key
7180
local_ptr::init_tls_key();
7281

7382
Scheduler {
83+
sleeper_list: sleeper_list,
7484
event_loop: event_loop,
7585
work_queue: work_queue,
7686
stack_pool: StackPool::new(),
@@ -618,19 +628,23 @@ mod test {
618628
use container::Container;
619629
use vec::OwnedVector;
620630
use rt::rtio::RemoteCallback;
631+
use rt::sleeper_list::SleeperList;
621632

622633
do run_in_bare_thread {
634+
let sleepers1 = SleeperList::new();
623635
let work_queue1 = WorkQueue::new();
636+
637+
let sleepers2 = sleepers1.clone();
624638
let work_queue2 = work_queue1.clone();
625639

626640
let loop1 = ~UvEventLoop::new();
627-
let mut sched1 = ~Scheduler::new(loop1, work_queue1.clone());
641+
let mut sched1 = ~Scheduler::new(loop1, work_queue1.clone(), sleepers1);
628642
let handle1 = sched1.make_handle();
629643
let sched1_cell = Cell(sched1);
630644
let handle1_cell = Cell(handle1);
631645

632646
let loop2 = ~UvEventLoop::new();
633-
let mut sched2 = ~Scheduler::new(loop2, work_queue2.clone());
647+
let mut sched2 = ~Scheduler::new(loop2, work_queue2.clone(), sleepers2);
634648
let handle2 = sched2.make_handle();
635649
let sched2_cell = Cell(sched2);
636650
let handle2_cell = Cell(handle2);

branches/try2/src/libcore/rt/sleeper_list.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use option::{Option, Some, None};
1717
use cell::Cell;
1818
use unstable::sync::{Exclusive, exclusive};
1919
use rt::sched::{Scheduler, SchedHandle};
20+
use clone::Clone;
2021

2122
pub struct SleeperList {
2223
priv stack: ~Exclusive<~[SchedHandle]>
@@ -44,3 +45,11 @@ impl SleeperList {
4445
}
4546
}
4647
}
48+
49+
impl Clone for SleeperList {
50+
fn clone(&self) -> SleeperList {
51+
SleeperList {
52+
stack: self.stack.clone()
53+
}
54+
}
55+
}

branches/try2/src/libcore/rt/test.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ use rt::sched::Scheduler;
2121
pub fn new_test_uv_sched() -> Scheduler {
2222
use rt::uv::uvio::UvEventLoop;
2323
use rt::work_queue::WorkQueue;
24+
use rt::sleeper_list::SleeperList;
2425

25-
Scheduler::new(~UvEventLoop::new(), WorkQueue::new())
26+
Scheduler::new(~UvEventLoop::new(), WorkQueue::new(), SleeperList::new())
2627
}
2728

2829
/// Creates a new scheduler in a new thread and runs a task in it,

0 commit comments

Comments
 (0)