process main { var("hello") x; provide("A"); depend("A") d; val_equal(d.x, "hello") a; assert(a); d.x->set("world"); val_equal(d.x, "world") a; assert(a); var("hello") x; provide("B"); val_equal(x, "world") a; assert(a); var("hello") x; provide("C"); val_equal(x, "hello") a; assert(a); depend("C_done"); val_equal(x, "world") a; assert(a); var("hello") x; blocker() blk; provide("D"); val_equal(x, "hello") a; assert(a); blk->up(); val_equal(x, "0") a; assert(a); blk->down(); blk->up(); val_equal(x, "1") a; assert(a); exit("0"); } process proc1 { depend("B") dep; dep.x->set("world"); } process proc2 { depend("C") dep; sleep("0", "0"); dep.x->set("world"); provide("C_done"); } process proc3 { depend("D") dep; dep.blk->use(); provide("E"); } process proc4 { var("0") i; depend("E") dep; dep.dep.x->set(i); num_add(i, "1") j; i->set(j); }