process_manager.ncd 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. process main {
  2. var("0") x;
  3. var("false") backtrack_check;
  4. backtrack_point() point;
  5. If (backtrack_check) {
  6. val_equal(x, "10") a;
  7. assert(a);
  8. call("phase2", {});
  9. };
  10. process_manager() mgr;
  11. mgr->start("name", "increment", {"1", "2", "false"});
  12. val_equal(x, "1") a;
  13. assert(a);
  14. mgr->stop("name");
  15. val_equal(x, "3") a;
  16. assert(a);
  17. mgr->start("name", "increment", {"3", "4", "true"});
  18. val_equal(x, "6") a;
  19. assert(a);
  20. mgr->stop("name");
  21. val_equal(x, "6") a;
  22. assert(a);
  23. mgr->start("name", "increment", {"5", "6", "false"});
  24. val_equal(x, "6") a;
  25. assert(a);
  26. backtrack_check->set("true");
  27. point->go();
  28. }
  29. template phase2 {
  30. var("0") x;
  31. var("false") backtrack_check;
  32. backtrack_point() point;
  33. If (backtrack_check) {
  34. val_equal(x, "10") a;
  35. assert(a);
  36. call("phase3", {});
  37. };
  38. process_manager() mgr;
  39. mgr->start("name", "increment", {"1", "2", "true"});
  40. val_equal(x, "1") a;
  41. assert(a);
  42. mgr->stop("name");
  43. val_equal(x, "1") a;
  44. assert(a);
  45. mgr->start("name", "increment", {"3", "4", "true"});
  46. val_equal(x, "1") a;
  47. assert(a);
  48. depend("INC_DONE");
  49. val_equal(x, "6") a;
  50. assert(a);
  51. backtrack_check->set("true");
  52. point->go();
  53. }
  54. template phase3 {
  55. var("0") x;
  56. var("false") backtrack_check;
  57. backtrack_point() point;
  58. If (backtrack_check) {
  59. val_equal(x, "10") a;
  60. assert(a);
  61. exit("0");
  62. };
  63. process_manager() mgr;
  64. mgr->start("increment", {"1", "2", "false"});
  65. val_equal(x, "1") a;
  66. assert(a);
  67. mgr->start("increment", {"3", "4", "false"});
  68. val_equal(x, "4") a;
  69. assert(a);
  70. backtrack_check->set("true");
  71. point->go();
  72. }
  73. template increment {
  74. var(_arg0) amount;
  75. var(_arg1) amount_deinit;
  76. var(_arg2) do_sleep;
  77. imperative("<none>", {}, "increment_deinit_inc", {}, "10000");
  78. num_add(_caller.x, amount) new_x;
  79. _caller.x->set(new_x);
  80. If (do_sleep) {
  81. sleep("0", "0");
  82. };
  83. provide("INC_DONE");
  84. }
  85. template increment_deinit_inc {
  86. num_add(_caller._caller.x, _caller.amount_deinit) new_x;
  87. _caller._caller.x->set(new_x);
  88. }