Skip to content

Commit fb528dd

Browse files
committed
rt: Allow some schedulers to stay alive even without tasks to execute
1 parent 0a5e9d4 commit fb528dd

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

src/rt/rust_kernel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ rust_kernel::create_scheduler(size_t num_threads) {
6969
id = max_sched_id++;
7070
K(srv, id != INTPTR_MAX, "Hit the maximum scheduler id");
7171
sched = new (this, "rust_scheduler")
72-
rust_scheduler(this, srv, num_threads, id);
72+
rust_scheduler(this, srv, num_threads, id, true);
7373
bool is_new = sched_table
7474
.insert(std::pair<rust_sched_id,
7575
rust_scheduler*>(id, sched)).second;

src/rt/rust_scheduler.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
rust_scheduler::rust_scheduler(rust_kernel *kernel,
66
rust_srv *srv,
77
size_t num_threads,
8-
rust_sched_id id) :
8+
rust_sched_id id,
9+
bool allow_exit) :
910
kernel(kernel),
1011
srv(srv),
1112
env(srv->env),
1213
live_threads(num_threads),
1314
live_tasks(0),
14-
num_threads(num_threads),
1515
cur_thread(0),
16+
may_exit(allow_exit),
17+
num_threads(num_threads),
1618
id(id)
1719
{
1820
create_task_threads();
@@ -103,12 +105,11 @@ rust_scheduler::release_task() {
103105
{
104106
scoped_lock with(lock);
105107
live_tasks--;
106-
if (live_tasks == 0) {
108+
if (live_tasks == 0 && may_exit) {
107109
need_exit = true;
108110
}
109111
}
110112
if (need_exit) {
111-
// There are no more tasks on this scheduler. Time to leave
112113
exit();
113114
}
114115
}
@@ -139,3 +140,16 @@ rust_scheduler::release_task_thread() {
139140
kernel->release_scheduler_id(id);
140141
}
141142
}
143+
144+
void
145+
rust_scheduler::allow_exit() {
146+
bool need_exit = false;
147+
{
148+
scoped_lock with(lock);
149+
may_exit = true;
150+
need_exit = live_tasks == 0;
151+
}
152+
if (need_exit) {
153+
exit();
154+
}
155+
}

src/rt/rust_scheduler.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,17 @@ class rust_scheduler : public kernel_owned<rust_scheduler> {
1212
rust_srv *srv;
1313
rust_env *env;
1414
private:
15-
// Protects live_threads and cur_thread increments
15+
// Protects live_threads, live_tasks, cur_thread, may_exit
1616
lock_and_signal lock;
1717
// When this hits zero we'll tell the kernel to release us
1818
uintptr_t live_threads;
1919
// When this hits zero we'll tell the threads to exit
2020
uintptr_t live_tasks;
21+
size_t cur_thread;
22+
bool may_exit;
2123

2224
array_list<rust_sched_launcher *> threads;
2325
const size_t num_threads;
24-
size_t cur_thread;
2526

2627
rust_sched_id id;
2728

@@ -35,7 +36,7 @@ class rust_scheduler : public kernel_owned<rust_scheduler> {
3536

3637
public:
3738
rust_scheduler(rust_kernel *kernel, rust_srv *srv, size_t num_threads,
38-
rust_sched_id id);
39+
rust_sched_id id, bool allow_exit);
3940
~rust_scheduler();
4041

4142
void start_task_threads();
@@ -51,6 +52,9 @@ class rust_scheduler : public kernel_owned<rust_scheduler> {
5152
void release_task_thread();
5253

5354
rust_sched_id get_id() { return id; }
55+
// Tells the scheduler that as soon as it runs out of tasks
56+
// to run it should exit
57+
void allow_exit();
5458
};
5559

5660
#endif /* RUST_SCHEDULER_H */

0 commit comments

Comments
 (0)