Reputation: 59
I have met a semantic problem with guard conditions and fork in activity diagrams. Suppose terminating action A leads to a fork, and the out put of the fork leads to action B and C (that is, this fork has 1 input and 2 outputs). If A has successfully terminated, and guard condition of B is valid while guard condition of C is not, will the whole activity continue to action B and waits for guard condition of C to become true, or neither B nor C would be executed?
Update: consider the following activity example
Suppose that the first time A terminates, guard condition of C is not valid while B does not have guard. Along the merge node, A is exectued the second time. After the second termination of A, guard condition of C becomes eternally valid and it will be executed twice continuously due to the first and second termination of A. Is this correct?
Upvotes: 1
Views: 1864
Reputation: 36313
Once A
is finished it will emerge a token and the fork will duplicate that. One token goes straight to B
which after finalization re-triggers A
to infinity. Now, what happens to the token(s) traveling to C
? They just queue at the guard. When the guard is opened after some time it lets pass a single token (because C
can hold only a single one). When C
is finished it will allow another token to enter (if meanwhile multiple tokens have reached) depending additionally on the guard. Basically C
can be started as many times as A
has been completed before.
N.B. Your implication in the question "guard conditions on the outputs" is wrong. A guard is always on an incoming control flow of an action. The fork will not control the guard, it's the action. And further an action can never have a guard on the output. This is controlled be the action's behavior. When it terminates it will emerge a token on each of its outgoing control flows (so called implicit fork).
Answer to initial question left as common information
Actually when you draw it, the situation is obvious:
The token emerging right from the top fork will be blocked. B
will start since the token passed the guard. Because C
does not start the lower fork will hang as it needs 2 tokens. So D
is not reached. Unless the guard from C
will somewhen be unblocked externally.
Upvotes: 2