113 lines
2.3 KiB
Plaintext
113 lines
2.3 KiB
Plaintext
process main {
|
|
var("0") x;
|
|
|
|
var("false") backtrack_check;
|
|
backtrack_point() point;
|
|
If (backtrack_check) {
|
|
val_equal(x, "10") a;
|
|
assert(a);
|
|
call("phase2", {});
|
|
};
|
|
|
|
process_manager() mgr;
|
|
|
|
mgr->start("name", "increment", {"1", "2", "false"});
|
|
val_equal(x, "1") a;
|
|
assert(a);
|
|
|
|
mgr->stop("name");
|
|
val_equal(x, "3") a;
|
|
assert(a);
|
|
|
|
mgr->start("name", "increment", {"3", "4", "true"});
|
|
val_equal(x, "6") a;
|
|
assert(a);
|
|
|
|
mgr->stop("name");
|
|
val_equal(x, "6") a;
|
|
assert(a);
|
|
|
|
mgr->start("name", "increment", {"5", "6", "false"});
|
|
val_equal(x, "6") a;
|
|
assert(a);
|
|
|
|
backtrack_check->set("true");
|
|
point->go();
|
|
}
|
|
|
|
template phase2 {
|
|
var("0") x;
|
|
|
|
var("false") backtrack_check;
|
|
backtrack_point() point;
|
|
If (backtrack_check) {
|
|
val_equal(x, "10") a;
|
|
assert(a);
|
|
call("phase3", {});
|
|
};
|
|
|
|
process_manager() mgr;
|
|
|
|
mgr->start("name", "increment", {"1", "2", "true"});
|
|
val_equal(x, "1") a;
|
|
assert(a);
|
|
|
|
mgr->stop("name");
|
|
val_equal(x, "1") a;
|
|
assert(a);
|
|
|
|
mgr->start("name", "increment", {"3", "4", "true"});
|
|
val_equal(x, "1") a;
|
|
assert(a);
|
|
|
|
depend("INC_DONE");
|
|
val_equal(x, "6") a;
|
|
assert(a);
|
|
|
|
backtrack_check->set("true");
|
|
point->go();
|
|
}
|
|
|
|
template phase3 {
|
|
var("0") x;
|
|
|
|
var("false") backtrack_check;
|
|
backtrack_point() point;
|
|
If (backtrack_check) {
|
|
val_equal(x, "10") a;
|
|
assert(a);
|
|
exit("0");
|
|
};
|
|
|
|
process_manager() mgr;
|
|
|
|
mgr->start("increment", {"1", "2", "false"});
|
|
val_equal(x, "1") a;
|
|
assert(a);
|
|
|
|
mgr->start("increment", {"3", "4", "false"});
|
|
val_equal(x, "4") a;
|
|
assert(a);
|
|
|
|
backtrack_check->set("true");
|
|
point->go();
|
|
}
|
|
|
|
template increment {
|
|
var(_arg0) amount;
|
|
var(_arg1) amount_deinit;
|
|
var(_arg2) do_sleep;
|
|
imperative("<none>", {}, "increment_deinit_inc", {}, "10000");
|
|
num_add(_caller.x, amount) new_x;
|
|
_caller.x->set(new_x);
|
|
If (do_sleep) {
|
|
sleep("0", "0");
|
|
};
|
|
provide("INC_DONE");
|
|
}
|
|
|
|
template increment_deinit_inc {
|
|
num_add(_caller._caller.x, _caller.amount_deinit) new_x;
|
|
_caller._caller.x->set(new_x);
|
|
}
|