From 62b51d9152e3289c8054792035ea63088247fead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Thu, 13 Sep 2012 20:47:35 +0200 Subject: [PATCH] rt: Implement ThreadPerCore scheduling mode Fixes #3465. --- src/libcore/task.rs | 18 ++++++++++++++---- src/rt/rust_builtin.cpp | 8 +++++++- src/rt/rustrt.def.in | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/libcore/task.rs b/src/libcore/task.rs index 8f186d86168ce..2780836599e31 100644 --- a/src/libcore/task.rs +++ b/src/libcore/task.rs @@ -1403,11 +1403,9 @@ fn spawn_raw(+opts: TaskOpts, +f: fn~()) { let num_threads = match opts.mode { SingleThreaded => 1u, - ThreadPerCore => { - fail ~"thread_per_core scheduling mode unimplemented" - } + ThreadPerCore => rustrt::rust_num_threads(), ThreadPerTask => { - fail ~"thread_per_task scheduling mode unimplemented" + fail ~"ThreadPerTask scheduling mode unimplemented" } ManualThreads(threads) => { if threads == 0u { @@ -1657,6 +1655,8 @@ extern mod rustrt { fn rust_get_sched_id() -> sched_id; fn rust_new_sched(num_threads: libc::uintptr_t) -> sched_id; + fn sched_threads() -> libc::size_t; + fn rust_num_threads() -> libc::uintptr_t; fn get_task_id() -> task_id; #[rust_stack] @@ -2422,3 +2422,13 @@ fn test_tls_cleanup_on_failure() unsafe { local_data_set(int_key, @31337); fail; } + +#[test] +fn test_sched_thread_per_core() { + let cores = rustrt::rust_num_threads(); + let mut reported_threads = 0u; + do spawn_sched(ThreadPerCore) { + reported_threads = rustrt::sched_threads(); + } + assert(cores == reported_threads); +} diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index b72fdd15e3c0a..a601908359c8c 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -572,6 +572,12 @@ rust_get_sched_id() { return task->sched->get_id(); } +extern "C" CDECL uintptr_t +rust_num_threads() { + rust_task *task = rust_get_current_task(); + return task->kernel->env->num_sched_threads; +} + extern "C" CDECL rust_sched_id rust_new_sched(uintptr_t threads) { rust_task *task = rust_get_current_task(); @@ -620,7 +626,7 @@ start_task(rust_task *target, fn_env_pair *f) { target->start(f->f, f->env, NULL); } -extern "C" CDECL int +extern "C" CDECL size_t sched_threads() { rust_task *task = rust_get_current_task(); return task->sched->number_of_threads(); diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index 6a72726b0ae0f..cb2f36fe31ba4 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -32,6 +32,7 @@ rand_seed rust_get_sched_id rust_new_sched rust_new_task_in_sched +rust_num_threads rust_path_is_dir rust_path_exists rust_getcwd