Skip to content

Commit cb9ab93

Browse files
committed
---
yaml --- r: 14133 b: refs/heads/try c: 2f4e7c1 h: refs/heads/master i: 14131: da45ff9 v: v3
1 parent d7e0c43 commit cb9ab93

File tree

6 files changed

+73
-4
lines changed

6 files changed

+73
-4
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: f2a1aa2649ad030f189c54245ee182a0aa6983ed
5+
refs/heads/try: 2f4e7c157eb3ab9cd8270c3e9fffedd03f0cb055
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/rt/rust_builtin.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,16 +431,43 @@ nano_time(uint64_t *ns) {
431431
*ns = t.time_ns();
432432
}
433433

434+
extern "C" CDECL rust_sched_id
435+
rust_get_sched_id() {
436+
rust_task *task = rust_task_thread::get_task();
437+
return task->sched->get_id();
438+
}
439+
440+
extern "C" CDECL rust_sched_id
441+
rust_new_sched(size_t threads) {
442+
rust_task *task = rust_task_thread::get_task();
443+
A(task->thread, threads > 0,
444+
"Can't create a scheduler with no threads, silly!");
445+
return task->kernel->create_scheduler(threads);
446+
}
447+
434448
extern "C" CDECL rust_task_id
435449
get_task_id() {
436450
rust_task *task = rust_task_thread::get_task();
437451
return task->user.id;
438452
}
439453

454+
static rust_task_id
455+
new_task_common(rust_scheduler *sched, rust_task *parent) {
456+
return sched->create_task(parent, NULL);
457+
}
458+
440459
extern "C" CDECL rust_task_id
441460
new_task() {
442461
rust_task *task = rust_task_thread::get_task();
443-
return task->sched->create_task(task, NULL);
462+
return new_task_common(task->sched, task);
463+
}
464+
465+
extern "C" CDECL rust_task_id
466+
rust_new_task_in_sched(rust_sched_id id) {
467+
rust_task *task = rust_task_thread::get_task();
468+
rust_scheduler *sched = task->kernel->get_scheduler_by_id(id);
469+
// FIXME: What if we didn't get the scheduler?
470+
return new_task_common(sched, task);
444471
}
445472

446473
extern "C" CDECL void

branches/try/src/rt/rust_kernel.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,11 @@ void rust_kernel::free(void *mem) {
5959
rust_sched_id
6060
rust_kernel::create_scheduler(size_t num_threads) {
6161
I(this, !sched_lock.lock_held_by_current_thread());
62+
rust_sched_id id;
6263
rust_scheduler *sched;
6364
{
6465
scoped_lock with(sched_lock);
65-
rust_sched_id id = max_sched_id++;
66+
id = max_sched_id++;
6667
K(srv, id != INTPTR_MAX, "Hit the maximum scheduler id");
6768
sched = new (this, "rust_scheduler")
6869
rust_scheduler(this, srv, num_threads, id);
@@ -72,7 +73,7 @@ rust_kernel::create_scheduler(size_t num_threads) {
7273
live_schedulers++;
7374
}
7475
sched->start_task_threads();
75-
return 0;
76+
return id;
7677
}
7778

7879
rust_scheduler *

branches/try/src/rt/rust_scheduler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class rust_scheduler : public kernel_owned<rust_scheduler> {
4949
// Called by each thread when it terminates. When all threads
5050
// terminate the scheduler does as well.
5151
void release_task_thread();
52+
53+
rust_sched_id get_id() { return id; }
5254
};
5355

5456
#endif /* RUST_SCHEDULER_H */

branches/try/src/rt/rustrt.def.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ rand_free
2424
rand_new
2525
rand_next
2626
refcount
27+
rust_get_sched_id
28+
rust_new_sched
29+
rust_new_task_in_sched
2730
rust_path_is_dir
2831
rust_path_exists
2932
rust_getcwd
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Tests of the runtime's scheduler interface
2+
3+
type sched_id = int;
4+
type task_id = int;
5+
6+
type task = *ctypes::void;
7+
type closure = *ctypes::void;
8+
9+
native mod rustrt {
10+
fn rust_new_sched(num_threads: ctypes::size_t) -> sched_id;
11+
fn rust_get_sched_id() -> sched_id;
12+
fn rust_new_task_in_sched(id: sched_id) -> task_id;
13+
fn start_task(id: task_id, f: closure);
14+
}
15+
16+
fn main() unsafe {
17+
let po = comm::port();
18+
let ch = comm::chan(po);
19+
let parent_sched_id = rustrt::rust_get_sched_id();
20+
#error("parent %?", parent_sched_id);
21+
let num_threads = 1u;
22+
let new_sched_id = rustrt::rust_new_sched(num_threads);
23+
#error("new_sched_id %?", new_sched_id);
24+
let new_task_id = rustrt::rust_new_task_in_sched(new_sched_id);
25+
let f = fn~() {
26+
let child_sched_id = rustrt::rust_get_sched_id();
27+
#error("child_sched_id %?", child_sched_id);
28+
assert child_sched_id != parent_sched_id;
29+
assert child_sched_id == new_sched_id;
30+
comm::send(ch, ());
31+
};
32+
let fptr = unsafe::reinterpret_cast(ptr::addr_of(f));
33+
rustrt::start_task(new_task_id, fptr);
34+
unsafe::leak(f);
35+
comm::recv(po);
36+
}

0 commit comments

Comments
 (0)