Skip to content

Commit 3bec647

Browse files
committed
rt: Refactor the rust_kernel_interface a bit
1 parent a951a41 commit 3bec647

File tree

4 files changed

+36
-26
lines changed

4 files changed

+36
-26
lines changed

src/rt/rust.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
7878
check_claims = env->check_claims;
7979

8080
rust_srv *srv = new rust_srv(env);
81-
rust_kernel *kernel = new rust_kernel(srv, env->num_sched_threads);
82-
rust_scheduler *sched = kernel->get_default_scheduler();
81+
rust_kernel *kernel = new rust_kernel(srv);
82+
rust_sched_id sched_id = kernel->create_scheduler(env->num_sched_threads);
83+
rust_scheduler *sched = kernel->get_scheduler_by_id(sched_id);
8384
rust_task_id root_id = sched->create_task(NULL, "main", MAIN_STACK_SIZE);
8485
rust_task *root_task = kernel->get_task_by_id(root_id);
8586
I(kernel, root_task != NULL);
@@ -98,7 +99,7 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
9899
root_task->deref();
99100
root_task = NULL;
100101

101-
int ret = kernel->start_schedulers();
102+
int ret = kernel->wait_for_schedulers();
102103
delete args;
103104
delete kernel;
104105
delete srv;

src/rt/rust_kernel.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,16 @@
77
#define KLOG_ERR_(field, ...) \
88
KLOG_LVL(this, field, log_err, __VA_ARGS__)
99

10-
rust_kernel::rust_kernel(rust_srv *srv, size_t num_threads) :
10+
rust_kernel::rust_kernel(rust_srv *srv) :
1111
_region(srv, true),
1212
_log(srv, NULL),
1313
srv(srv),
1414
live_tasks(0),
1515
max_task_id(0),
1616
rval(0),
17+
live_schedulers(0),
1718
env(srv->env)
1819
{
19-
sched = new (this, "rust_scheduler")
20-
rust_scheduler(this, srv, num_threads, 0);
21-
live_schedulers = 1;
2220
}
2321

2422
void
@@ -56,27 +54,22 @@ void rust_kernel::free(void *mem) {
5654
_region.free(mem);
5755
}
5856

59-
int rust_kernel::start_schedulers()
60-
{
61-
I(this, !sched_lock.lock_held_by_current_thread());
62-
sched->start_task_threads();
63-
{
64-
scoped_lock with(sched_lock);
65-
// Schedulers could possibly have already exited
66-
if (live_schedulers != 0) {
67-
sched_lock.wait();
68-
}
69-
return rval;
70-
}
57+
rust_sched_id
58+
rust_kernel::create_scheduler(size_t num_threads) {
59+
I(this, live_schedulers == 0);
60+
sched = new (this, "rust_scheduler")
61+
rust_scheduler(this, srv, num_threads, 0);
62+
live_schedulers = 1;
63+
return 0;
7164
}
7265

7366
rust_scheduler *
74-
rust_kernel::get_default_scheduler() {
67+
rust_kernel::get_scheduler_by_id(rust_sched_id id) {
7568
return sched;
7669
}
7770

7871
void
79-
rust_kernel::release_scheduler() {
72+
rust_kernel::release_scheduler_id(rust_sched_id id) {
8073
I(this, !sched_lock.lock_held_by_current_thread());
8174
scoped_lock with(sched_lock);
8275
delete sched;
@@ -87,6 +80,21 @@ rust_kernel::release_scheduler() {
8780
}
8881
}
8982

83+
int
84+
rust_kernel::wait_for_schedulers()
85+
{
86+
I(this, !sched_lock.lock_held_by_current_thread());
87+
sched->start_task_threads();
88+
{
89+
scoped_lock with(sched_lock);
90+
// Schedulers could possibly have already exited
91+
if (live_schedulers != 0) {
92+
sched_lock.wait();
93+
}
94+
return rval;
95+
}
96+
}
97+
9098
void
9199
rust_kernel::fail() {
92100
// FIXME: On windows we're getting "Application has requested the

src/rt/rust_kernel.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class rust_kernel {
4646

4747
struct rust_env *env;
4848

49-
rust_kernel(rust_srv *srv, size_t num_threads);
49+
rust_kernel(rust_srv *srv);
5050

5151
void log(uint32_t level, char const *fmt, ...);
5252
void fatal(char const *fmt, ...);
@@ -57,10 +57,11 @@ class rust_kernel {
5757

5858
void fail();
5959

60-
int start_schedulers();
61-
rust_scheduler* get_default_scheduler();
60+
rust_sched_id create_scheduler(size_t num_threads);
61+
rust_scheduler* get_scheduler_by_id(rust_sched_id id);
6262
// Called by a scheduler to indicate that it is terminating
63-
void release_scheduler();
63+
void release_scheduler_id(rust_sched_id id);
64+
int wait_for_schedulers();
6465

6566
#ifdef __WIN32__
6667
void win32_require(LPCTSTR fn, BOOL ok);

src/rt/rust_scheduler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,6 @@ rust_scheduler::release_task_thread() {
115115
new_live_threads = --live_threads;
116116
}
117117
if (new_live_threads == 0) {
118-
kernel->release_scheduler();
118+
kernel->release_scheduler_id(id);
119119
}
120120
}

0 commit comments

Comments
 (0)