Skip to content

Commit 609144f

Browse files
committed
rt: Extract start_main_loop from rust_sched_loop to rust_sched_driver
1 parent 218dd08 commit 609144f

File tree

8 files changed

+108
-32
lines changed

8 files changed

+108
-32
lines changed

mk/rt.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ RUNTIME_CS_$(1) := \
5252
rt/rust_env.cpp \
5353
rt/rust_sched_loop.cpp \
5454
rt/rust_sched_launcher.cpp \
55+
rt/rust_sched_driver.cpp \
5556
rt/rust_scheduler.cpp \
5657
rt/rust_sched_reaper.cpp \
5758
rt/rust_task.cpp \

src/rt/rust_sched_driver.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <assert.h>
2+
#include "rust_internal.h"
3+
#include "rust_sched_driver.h"
4+
#include "rust_sched_loop.h"
5+
6+
rust_sched_driver::rust_sched_driver(rust_sched_loop *sched_loop)
7+
: sched_loop(sched_loop),
8+
signalled(false) {
9+
10+
assert(sched_loop != NULL);
11+
sched_loop->on_pump_loop(this);
12+
}
13+
14+
/**
15+
* Starts the main scheduler loop which performs task scheduling for this
16+
* domain.
17+
*
18+
* Returns once no more tasks can be scheduled and all task ref_counts
19+
* drop to zero.
20+
*/
21+
void
22+
rust_sched_driver::start_main_loop() {
23+
assert(sched_loop != NULL);
24+
25+
rust_sched_loop_state state = sched_loop_state_keep_going;
26+
while (state != sched_loop_state_exit) {
27+
DLOG(sched_loop, dom, "pumping scheduler");
28+
state = sched_loop->run_single_turn();
29+
30+
if (state == sched_loop_state_block) {
31+
scoped_lock with(lock);
32+
if (!signalled) {
33+
DLOG(sched_loop, dom, "blocking scheduler");
34+
lock.wait();
35+
}
36+
signalled = false;
37+
}
38+
}
39+
}
40+
41+
void
42+
rust_sched_driver::signal() {
43+
scoped_lock with(lock);
44+
signalled = true;
45+
lock.signal();
46+
}

src/rt/rust_sched_driver.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#ifndef RUST_SCHED_DRIVER_H
2+
#define RUST_SCHED_DRIVER_H
3+
4+
#include "sync/lock_and_signal.h"
5+
#include "rust_signal.h"
6+
7+
struct rust_sched_loop;
8+
9+
class rust_sched_driver : public rust_signal {
10+
private:
11+
rust_sched_loop *sched_loop;
12+
lock_and_signal lock;
13+
bool signalled;
14+
15+
public:
16+
rust_sched_driver(rust_sched_loop *sched_loop);
17+
18+
void start_main_loop();
19+
20+
virtual void signal();
21+
};
22+
23+
#endif /* RUST_SCHED_DRIVER_H */

src/rt/rust_sched_launcher.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ rust_sched_launcher::rust_sched_launcher(rust_scheduler *sched,
77
rust_srv *srv, int id)
88
: rust_thread(SCHED_STACK_SIZE),
99
kernel(sched->kernel),
10-
sched_loop(sched, srv, id) {
10+
sched_loop(sched, srv, id),
11+
driver(&sched_loop) {
1112
}
1213

1314
void
1415
rust_sched_launcher::run() {
15-
sched_loop.start_main_loop();
16+
driver.start_main_loop();
1617
}

src/rt/rust_sched_launcher.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33

44
#include "rust_internal.h"
55
#include "sync/rust_thread.h"
6-
7-
#ifndef _WIN32
8-
#include <pthread.h>
9-
#else
10-
#include <windows.h>
11-
#endif
6+
#include "rust_sched_driver.h"
127

138
class rust_sched_launcher
149
: public kernel_owned<rust_sched_launcher>,
@@ -18,6 +13,7 @@ class rust_sched_launcher
1813

1914
private:
2015
rust_sched_loop sched_loop;
16+
rust_sched_driver driver;
2117

2218
public:
2319
rust_sched_launcher(rust_scheduler *sched, rust_srv *srv, int id);

src/rt/rust_sched_loop.cpp

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ rust_sched_loop::rust_sched_loop(rust_scheduler *sched,
2525
should_exit(false),
2626
cached_c_stack(NULL),
2727
dead_task(NULL),
28+
pump_signal(NULL),
2829
kernel(sched->kernel),
2930
sched(sched),
3031
srv(srv),
@@ -183,32 +184,24 @@ rust_sched_loop::log_state() {
183184
}
184185
}
185186

186-
/**
187-
* Starts the main scheduler loop which performs task scheduling for this
188-
* domain.
189-
*
190-
* Returns once no more tasks can be scheduled and all task ref_counts
191-
* drop to zero.
192-
*/
193187
void
194-
rust_sched_loop::start_main_loop() {
195-
DLOG(this, dom, "started domain loop %d", id);
196-
197-
rust_sched_loop_state state = sched_loop_state_keep_going;
198-
while (state != sched_loop_state_exit) {
199-
state = run_single_turn();
188+
rust_sched_loop::on_pump_loop(rust_signal *signal) {
189+
I(this, pump_signal == NULL);
190+
I(this, signal != NULL);
191+
pump_signal = signal;
192+
}
200193

201-
scoped_lock with(lock);
202-
if (!should_exit && running_tasks.length() == 0) {
203-
lock.wait();
204-
}
205-
DLOG(this, task,
206-
"scheduler %d resuming ...", id);
207-
}
194+
void
195+
rust_sched_loop::pump_loop() {
196+
I(this, pump_signal != NULL);
197+
pump_signal->signal();
208198
}
209199

210200
rust_sched_loop_state
211201
rust_sched_loop::run_single_turn() {
202+
DLOG(this, task,
203+
"scheduler %d resuming ...", id);
204+
212205
lock.lock();
213206

214207
if (!should_exit) {
@@ -344,7 +337,7 @@ rust_sched_loop::transition(rust_task *task,
344337
}
345338
task->set_state(dst, cond, cond_name);
346339

347-
lock.signal();
340+
pump_loop();
348341
}
349342

350343
#ifndef _WIN32
@@ -382,7 +375,7 @@ rust_sched_loop::exit() {
382375
scoped_lock with(lock);
383376
DLOG(this, dom, "Requesting exit for thread %d", id);
384377
should_exit = true;
385-
lock.signal();
378+
pump_loop();
386379
}
387380

388381
// Before activating each task, make sure we have a C stack available.

src/rt/rust_sched_loop.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "rust_internal.h"
55
#include "rust_stack.h"
6+
#include "rust_signal.h"
67
#include "context.h"
78

89
enum rust_task_state {
@@ -22,6 +23,8 @@ enum rust_sched_loop_state {
2223
sched_loop_state_exit
2324
};
2425

26+
struct rust_task;
27+
2528
typedef indexed_list<rust_task> rust_task_list;
2629

2730
struct rust_sched_loop
@@ -53,13 +56,15 @@ struct rust_sched_loop
5356
rust_task_list blocked_tasks;
5457
rust_task *dead_task;
5558

59+
rust_signal *pump_signal;
60+
5661
void prepare_c_stack(rust_task *task);
5762
void unprepare_c_stack();
5863

5964
rust_task_list *state_list(rust_task_state state);
6065
const char *state_name(rust_task_state state);
6166

62-
rust_sched_loop_state run_single_turn();
67+
void pump_loop();
6368

6469
public:
6570
rust_kernel *kernel;
@@ -96,7 +101,8 @@ struct rust_sched_loop
96101
void reap_dead_tasks();
97102
rust_task *schedule_task();
98103

99-
void start_main_loop();
104+
void on_pump_loop(rust_signal *signal);
105+
rust_sched_loop_state run_single_turn();
100106

101107
void log_state();
102108

src/rt/rust_signal.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef RUST_SIGNAL_H
2+
#define RUST_SIGNAL_H
3+
4+
// Just an abstrict class that reperesents something that can be signalled
5+
class rust_signal {
6+
public:
7+
virtual void signal() = 0;
8+
};
9+
10+
#endif /* RUST_SIGNAL_H */

0 commit comments

Comments
 (0)