diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-04-18 18:38:12 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-04-19 12:05:18 -0700 |
| commit | 15ece0c23ef9b2e696ea4e81bf088e37fedc5d01 (patch) | |
| tree | e0a86454bba7b00ad58c75fb81e43b39461f6d08 /src/libcore/task | |
| parent | 6773b63671081c722761d3980393642452c08157 (diff) | |
| download | rust-15ece0c23ef9b2e696ea4e81bf088e37fedc5d01.tar.gz rust-15ece0c23ef9b2e696ea4e81bf088e37fedc5d01.zip | |
core: Wire up `spawn` to the new scheduler
It will check which scheduler it is running under and create the correct type of task as appropriate. Most options aren't supported but basic spawning works.
Diffstat (limited to 'src/libcore/task')
| -rw-r--r-- | src/libcore/task/mod.rs | 9 | ||||
| -rw-r--r-- | src/libcore/task/spawn.rs | 29 |
2 files changed, 38 insertions, 0 deletions
diff --git a/src/libcore/task/mod.rs b/src/libcore/task/mod.rs index 9a0063b746a..a6c03638713 100644 --- a/src/libcore/task/mod.rs +++ b/src/libcore/task/mod.rs @@ -1226,3 +1226,12 @@ fn test_spawn_thread_on_demand() { port.recv(); } + +#[test] +fn test_simple_newsched_spawn() { + use rt::run_in_newsched_task; + + do run_in_newsched_task { + spawn(||()) + } +} diff --git a/src/libcore/task/spawn.rs b/src/libcore/task/spawn.rs index c71f7d26d40..47e38602995 100644 --- a/src/libcore/task/spawn.rs +++ b/src/libcore/task/spawn.rs @@ -531,6 +531,35 @@ fn gen_child_taskgroup(linked: bool, supervised: bool) } pub fn spawn_raw(opts: TaskOpts, f: ~fn()) { + use rt::*; + + match context() { + OldTaskContext => { + spawn_raw_oldsched(opts, f) + } + TaskContext => { + spawn_raw_newsched(opts, f) + } + SchedulerContext => { + fail!(~"can't spawn from scheduler context") + } + GlobalContext => { + fail!(~"can't spawn from global context") + } + } +} + +fn spawn_raw_newsched(opts: TaskOpts, f: ~fn()) { + use rt::sched::*; + + // XXX: How to schedule a new task is a policy decision that shouldn't be made here + let mut sched = Scheduler::take_local(); + let task = ~Task::new(&mut sched.stack_pool, f); + sched.resume_task_from_running_task_direct(task); +} + +fn spawn_raw_oldsched(opts: TaskOpts, f: ~fn()) { + let (child_tg, ancestors, is_main) = gen_child_taskgroup(opts.linked, opts.supervised); |
