diff options
Diffstat (limited to 'src/rt/rust_sched_driver.cpp')
| -rw-r--r-- | src/rt/rust_sched_driver.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/rt/rust_sched_driver.cpp b/src/rt/rust_sched_driver.cpp new file mode 100644 index 00000000000..dd9ca9e7f10 --- /dev/null +++ b/src/rt/rust_sched_driver.cpp @@ -0,0 +1,46 @@ +#include <assert.h> +#include "rust_internal.h" +#include "rust_sched_driver.h" +#include "rust_sched_loop.h" + +rust_sched_driver::rust_sched_driver(rust_sched_loop *sched_loop) + : sched_loop(sched_loop), + signalled(false) { + + assert(sched_loop != NULL); + sched_loop->on_pump_loop(this); +} + +/** + * Starts the main scheduler loop which performs task scheduling for this + * domain. + * + * Returns once no more tasks can be scheduled and all task ref_counts + * drop to zero. + */ +void +rust_sched_driver::start_main_loop() { + assert(sched_loop != NULL); + + rust_sched_loop_state state = sched_loop_state_keep_going; + while (state != sched_loop_state_exit) { + DLOG(sched_loop, dom, "pumping scheduler"); + state = sched_loop->run_single_turn(); + + if (state == sched_loop_state_block) { + scoped_lock with(lock); + if (!signalled) { + DLOG(sched_loop, dom, "blocking scheduler"); + lock.wait(); + } + signalled = false; + } + } +} + +void +rust_sched_driver::signal() { + scoped_lock with(lock); + signalled = true; + lock.signal(); +} |
