diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-03-30 17:10:02 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-03-31 19:51:29 -0700 |
| commit | 609144f7a6adba552602feb7e50e7c4d6a815fae (patch) | |
| tree | a0281e219c6d944dbffcd408e7291d14ae08e21e /src/rt/rust_sched_driver.cpp | |
| parent | 218dd084697ed2ce58812ef9e69cdc86cb83bcf2 (diff) | |
| download | rust-609144f7a6adba552602feb7e50e7c4d6a815fae.tar.gz rust-609144f7a6adba552602feb7e50e7c4d6a815fae.zip | |
rt: Extract start_main_loop from rust_sched_loop to rust_sched_driver
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(); +} |
