int main() { creat(7); printq(); enq(9); printq(); outq(); printq(); return 0; }
void TestLimiterNode() { int out_int; tbb::flow::graph g; tbb::flow::limiter_node<int> ln(g,1); REMARK("Testing limiter_node: preds and succs"); ASSERT(ln.decrement.my_predecessor_count == 0, "error in pred count"); ASSERT(ln.decrement.my_initial_predecessor_count == 0, "error in initial pred count"); ASSERT(ln.decrement.my_current_count == 0, "error in current count"); ASSERT(ln.init_decrement_predecessors == 0, "error in decrement predecessors"); ASSERT(ln.my_threshold == 1, "error in my_threshold"); tbb::flow::queue_node<int> inq(g); tbb::flow::queue_node<int> outq(g); tbb::flow::broadcast_node<tbb::flow::continue_msg> bn(g); tbb::flow::make_edge(inq,ln); tbb::flow::make_edge(ln,outq); tbb::flow::make_edge(bn,ln.decrement); g.wait_for_all(); ASSERT(!(ln.my_successors.empty()),"successors empty after make_edge"); ASSERT(ln.my_predecessors.empty(), "input edge reversed"); inq.try_put(1); g.wait_for_all(); ASSERT(outq.try_get(out_int) && out_int == 1, "limiter_node didn't pass first value"); ASSERT(ln.my_predecessors.empty(), "input edge reversed"); inq.try_put(2); g.wait_for_all(); ASSERT(!outq.try_get(out_int), "limiter_node incorrectly passed second input"); ASSERT(!ln.my_predecessors.empty(), "input edge to limiter_node not reversed"); bn.try_put(tbb::flow::continue_msg()); g.wait_for_all(); ASSERT(outq.try_get(out_int) && out_int == 2, "limiter_node didn't pass second value"); g.wait_for_all(); ASSERT(!ln.my_predecessors.empty(), "input edge was reversed(after try_get())"); g.reset(); ASSERT(ln.my_predecessors.empty(), "input edge not reset"); inq.try_put(3); g.wait_for_all(); ASSERT(outq.try_get(out_int) && out_int == 3, "limiter_node didn't pass third value"); REMARK(" rf_clear_edges"); // currently the limiter_node will not pass another message g.reset(tbb::flow::rf_clear_edges); ASSERT(ln.decrement.my_predecessor_count == 0, "error in pred count"); ASSERT(ln.decrement.my_initial_predecessor_count == 0, "error in initial pred count"); ASSERT(ln.decrement.my_current_count == 0, "error in current count"); ASSERT(ln.init_decrement_predecessors == 0, "error in decrement predecessors"); ASSERT(ln.my_threshold == 1, "error in my_threshold"); ASSERT(ln.my_predecessors.empty(), "preds not reset(rf_clear_edges)"); ASSERT(ln.my_successors.empty(), "preds not reset(rf_clear_edges)"); ASSERT(inq.my_successors.empty(), "Arc not removed on reset(rf_clear_edges)"); ASSERT(inq.my_successors.empty(), "Arc not removed on reset(rf_clear_edges)"); ASSERT(bn.my_successors.empty(), "control edge not removed on reset(rf_clear_edges)"); tbb::flow::make_edge(inq,ln); tbb::flow::make_edge(ln,outq); inq.try_put(4); inq.try_put(5); g.wait_for_all(); ASSERT(outq.try_get(out_int),"missing output after reset(rf_clear_edges)"); ASSERT(out_int == 4, "input incorrect (4)"); bn.try_put(tbb::flow::continue_msg()); g.wait_for_all(); ASSERT(!outq.try_get(out_int),"second output incorrectly passed (rf_clear_edges)"); REMARK(" done\n"); }