Skip to content

Commit

Permalink
merging task/coroutine refactoring back into upstream
Browse files Browse the repository at this point in the history
  • Loading branch information
toddaaro committed Jul 1, 2013
2 parents 5cfad4b + ddbccec commit 062bfd3
Showing 1 changed file with 18 additions and 19 deletions.
37 changes: 18 additions & 19 deletions src/libstd/rt/sched.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ impl Scheduler {

rtdebug!("run taking sched");
let sched = Local::take::<Scheduler>();
// XXX: Reenable this once we're using a per-task queue. With a shared
// XXX: Reenable this once we're using a per-scheduler queue. With a shared
// queue this is not true
//assert!(sched.work_queue.is_empty());
rtdebug!("scheduler metrics: %s\n", {
Expand Down Expand Up @@ -191,29 +191,29 @@ impl Scheduler {
if sched.resume_task_from_queue() {
// We performed a scheduling action. There may be other work
// to do yet, so let's try again later.
let mut sched = Local::take::<Scheduler>();
sched.metrics.tasks_resumed_from_queue += 1;
sched.event_loop.callback(Scheduler::run_sched_once);
Local::put(sched);
do Local::borrow::<Scheduler, ()> |sched| {
sched.metrics.tasks_resumed_from_queue += 1;
sched.event_loop.callback(Scheduler::run_sched_once);
}
return;
}

// If we got here then there was no work to do.
// Generate a SchedHandle and push it to the sleeper list so
// somebody can wake us up later.
rtdebug!("no work to do");
let mut sched = Local::take::<Scheduler>();
sched.metrics.wasted_turns += 1;
if !sched.sleepy && !sched.no_sleep {
rtdebug!("sleeping");
sched.metrics.sleepy_times += 1;
sched.sleepy = true;
let handle = sched.make_handle();
sched.sleeper_list.push(handle);
} else {
rtdebug!("not sleeping");
do Local::borrow::<Scheduler, ()> |sched| {
sched.metrics.wasted_turns += 1;
if !sched.sleepy && !sched.no_sleep {
rtdebug!("sleeping");
sched.metrics.sleepy_times += 1;
sched.sleepy = true;
let handle = sched.make_handle();
sched.sleeper_list.push(handle);
} else {
rtdebug!("not sleeping");
}
}
Local::put(sched);
}

pub fn make_handle(&mut self) -> SchedHandle {
Expand Down Expand Up @@ -441,8 +441,7 @@ impl Scheduler {
// here we know we are home, execute now OR we know we
// aren't homed, and that this sched doesn't care
do this.switch_running_tasks_and_then(task) |sched, last_task| {
let last_task = Cell::new(last_task);
sched.enqueue_task(last_task.take());
sched.enqueue_task(last_task);
}
} else if !homed && !this.run_anything {
// the task isn't homed, but it can't be run here
Expand Down Expand Up @@ -1141,4 +1140,4 @@ mod test {
}
}
}
}
}

0 comments on commit 062bfd3

Please sign in to comment.