use taskorch::{Pool, Queue, TaskBuildNew, TaskBuildOp, TaskSubmitter};
mod util;
use util::*;
fn main() {
println!("----- test task orch -----");
let mut pool = Pool::new();
let qid1 = pool.insert_queue(&Queue::new()).unwrap();
let qid2 = pool.insert_queue(&Queue::new()).unwrap();
let submitter1 = pool.task_submitter(qid1).unwrap();
let submitter2 = pool.task_submitter(qid2).unwrap();
add_task_to_q1_by(&submitter1);
add_task_to_q2_by(&submitter2);
pool.spawn_thread_for(qid1);
pool.spawn_thread_for(qid1);
pool.spawn_thread_for(qid2);
pool.join();
}
fn add_task_to_q1_by(submitter:&TaskSubmitter) {
const Q:&'static str = "Q#A";
const PAD:&'static str = "";
submitter.submit((||ff(Q, PAD,"A-free","Hi, I am free.")).task());
let exit_task = |a:i32| exit_ff(Q,PAD,"Z1", a);
let id_exit = submitter.submit(exit_task.exit_task());
let exit_task = move|a:i32| exit_ffpr(Q, PAD,"Z2",a,"Z1");
let id_exit = submitter.submit(exit_task.exit_task().to(id_exit,0));
let task = move|a:i32,b:i32| ffadd(Q, PAD,"Aadd", a, b, "Z2");
let id_add = submitter.submit(task.task().to(id_exit,0));
let task = move||ffr(Q,PAD,"A1",(2,"Aadd"));
let _ = submitter.submit(task.task().to(id_add, 0));
let task = move||ffr(Q,PAD,"A2",(3,"Aadd"));
let _ = submitter.submit(task.task().to(id_add, 1));
}
fn add_task_to_q2_by(submitter:&TaskSubmitter) {
const Q:&'static str = "Q#B";
const PAD:&'static str = "";
submitter.submit((||ff(Q, PAD,"B-free", "Hi, I am free too.")).task());
let exit_task = |a:i32| exit_ff(Q, PAD,"Y1", a);
let id_exit = submitter.submit(exit_task.exit_task());
let task = move|a:i32| ffpr(Q,PAD, "B1", a, (3, "Y1"));
let taskid = submitter.submit(task.task().to(id_exit,0));
let task = move|a:i32| ffpr(Q,PAD, "B2", a, (4, "B1"));
let taskid = submitter.submit(task.task().to(taskid, 0));
let task = move||ffr(Q,PAD,"B3",(4,"B2"));
let _ = submitter.submit(task.task().to(taskid,0));
}