import option::{some, none};
import option = option::t;
export option, some, none;
+export repeat;
// Export the log levels as global constants. Higher levels mean
// more-verbosity. Error is the bottom level, default logging level is
const warn : int = 1;
const info : int = 2;
const debug : int = 3;
+
+/*
+Function: repeat
+
+Execute a function for a set number of times
+*/
+fn repeat(times: uint, f: block()) {
+ let i = 0u;
+ while i < times {
+ f();
+ i += 1u;
+ }
+}
class
circular_buffer : public kernel_owned<circular_buffer> {
- static const size_t INITIAL_CIRCULAR_BUFFER_SIZE_IN_UNITS = 8;
+ static const size_t INITIAL_CIRCULAR_BUFFER_SIZE_IN_UNITS = 1;
static const size_t MAX_CIRCULAR_BUFFER_SIZE = 1 << 24;
public:
*killed = true;
}
+ // We're not going to need any extra stack for a while
+ clear_stack_cache();
+
yield_timer.reset_us(time_in_us);
// Return to the scheduler.
record_stack_limit();
}
+void
+rust_task::clear_stack_cache() {
+ A(sched, stk != NULL, "Expected to have a stack");
+ if (stk->prev != NULL) {
+ free_stk(this, stk->prev);
+ stk->prev = NULL;
+ }
+}
+
void
rust_task::record_stack_limit() {
// The function prolog compares the amount of stack needed to the end of
--- /dev/null
+// xfail-test FIXME: Can't run under valgrind - too much RAM
+// FIXME: This doesn't spawn close to a million tasks yet
+
+tag msg {
+ ready(comm::chan<msg>);
+ start;
+ done(int);
+}
+
+fn calc(&&args: (int, comm::chan<msg>)) {
+ let (depth, parent_ch) = args;
+ let port = comm::port();
+ let children = depth > 0 ? 20u : 0u;
+ let child_chs = [];
+ let sum = 0;
+
+ repeat (children) {||
+ task::spawn((depth - 1, comm::chan(port)), calc);
+ }
+
+ repeat (children) {||
+ alt comm::recv(port) {
+ ready(child_ch) {
+ child_chs += [child_ch];
+ }
+ }
+ }
+
+ comm::send(parent_ch, ready(comm::chan(port)));
+
+ alt comm::recv(port) {
+ start. {
+ vec::iter (child_chs) { |child_ch|
+ comm::send(child_ch, start);
+ }
+ }
+ }
+
+ repeat (children) {||
+ alt comm::recv(port) {
+ done(child_sum) { sum += child_sum; }
+ }
+ }
+
+ comm::send(parent_ch, done(sum + 1));
+}
+
+fn main() {
+ let port = comm::port();
+ task::spawn((3, comm::chan(port)), calc);
+ alt comm::recv(port) {
+ ready(chan) {
+ comm::send(chan, start);
+ }
+ }
+ let sum = alt comm::recv(port) {
+ done(sum) { sum }
+ };
+ log #fmt("How many tasks? That's right, %d tasks.", sum);
+}
\ No newline at end of file