Class MultiwayBranchController
- java.lang.Object
-
- ptolemy.domains.csp.kernel.AbstractBranchController
-
- ptolemy.domains.csp.kernel.MultiwayBranchController
-
- All Implemented Interfaces:
Debuggable
public class MultiwayBranchController extends AbstractBranchController
This controller manages branches for performing multiway rendezvous within the CSP (Communication Sequential Processes) domain. Any CSP actors (either atomic or composite) that multiway rendezvous should contain an instance of this class. In addition, they also needs to implement the BranchActor interface.The multiway branches are created within the parent actor that contains this controller. The executeBranches() method takes those branches (an array) as an argument, and returns when every branch is successful. A successful branch is a branch that succeeds with its communication. Only branches whose guards are true are enabled. If no branch is enabled, i.e. if all the guards are false, then executeBranches() returns immediately. If exactly one branch is enabled, then the corresponding communication is an ordinary rendezvous. If more than one branch is enabled, a separate thread is created and started for each enabled branch. The executeBranches() method then waits for all of the branches to succeed. When the last branch thread has finished, the method returns, allowing the parent actor thread to continue.
- Since:
- Ptolemy II 5.2
- Version:
- $Id$
- Author:
- Edward A. Lee
- See Also:
ConditionalBranch
,BranchActor
,ConditionalReceive
,ConditionalSend
- Pt.AcceptedRating:
- Red (bilung)
- Pt.ProposedRating:
- Yellow (eal)
-
-
Field Summary
-
Fields inherited from class ptolemy.domains.csp.kernel.AbstractBranchController
_branches, _branchesActive, _debugging, _threadList
-
-
Constructor Summary
Constructors Constructor Description MultiwayBranchController(Actor container)
Construct a controller in the specified container, which should be an actor that implements BranchActor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
_branchFailed(int branchNumber)
Register the calling branch as failed.protected void
_branchNotReady(int branchNumber)
Indicate that the branch is not ready to rendezvous.protected void
_branchSucceeded(int branchID)
Register the calling branch as a successful branch.protected boolean
_isBranchReady(int branchNumber)
Return true if all branches under the control of this controller are ready.boolean
executeBranches(ConditionalBranch[] branches)
Execute a multiway rendezvous using the specified branches.-
Methods inherited from class ptolemy.domains.csp.kernel.AbstractBranchController
_branchBlocked, _branchUnblocked, _debug, _getDirector, addDebugListener, getParent, removeDebugListener, terminate
-
-
-
-
Constructor Detail
-
MultiwayBranchController
public MultiwayBranchController(Actor container)
Construct a controller in the specified container, which should be an actor that implements BranchActor.- Parameters:
container
- The parent actor that contains this object.
-
-
Method Detail
-
executeBranches
public boolean executeBranches(ConditionalBranch[] branches) throws IllegalActionException
Execute a multiway rendezvous using the specified branches. If the guard for any branch is false, then that branch is not enabled and it is ignored. If no branch is enabled, then this method returns immediately. Otherwise, it does not return until either all the branches are terminated or all have successfully completed a rendezvous.If exactly one branch is enabled, then the communication is performed directly as an ordinary rendezvous. If more than one branch is enabled, a thread is created and started for each enabled branch. These threads try to rendezvous until all succeed.
- Parameters:
branches
- The set of branches involved.- Returns:
- True if the branches all succeed, false if any them is terminated before completing the rendezvous.
- Throws:
IllegalActionException
- If the rendezvous fails (e.g. because of incompatible types).
-
_branchFailed
protected void _branchFailed(int branchNumber)
Register the calling branch as failed. This reduces the count of active branches, and if all the active branches have finished, it notifies the internal lock so any threads that are blocked on it can continue. This is called by a conditional branch just before it dies.- Overrides:
_branchFailed
in classAbstractBranchController
- Parameters:
branchNumber
- The ID assigned to the calling branch upon creation.
-
_branchNotReady
protected void _branchNotReady(int branchNumber)
Indicate that the branch is not ready to rendezvous. This method does nothing.- Specified by:
_branchNotReady
in classAbstractBranchController
- Parameters:
branchNumber
- The ID assigned to the branch upon creation.
-
_branchSucceeded
protected void _branchSucceeded(int branchID)
Register the calling branch as a successful branch. This reduces the count of active branches, and notifies the internal lock so that any threads blocked on it can continue.- Overrides:
_branchSucceeded
in classAbstractBranchController
- Parameters:
branchID
- The ID assigned to the calling branch upon creation.
-
_isBranchReady
protected boolean _isBranchReady(int branchNumber)
Return true if all branches under the control of this controller are ready.- Specified by:
_isBranchReady
in classAbstractBranchController
- Parameters:
branchNumber
- The ID assigned to the calling branch upon creation.- Returns:
- True if the calling branch is ready to rendezvous, otherwise false.
-
-