public class CSPActor extends TypedAtomicActor implements BranchActor
Two conditional communication constructs are available: "Conditional if"
(CIF) and "Conditional do" (CDO). The constructs are analogous to,
but different from, the common if and do statements. The
steps involved in using both of these are
(1) create the branches involved and assign an identification number
to each branch.
(2) call the chooseBranch() method, which invokes the chooseBranch()
method of the controller to determine which branch should succeed.
(3) execute the statements associated with the successful branch.
Each branch is either an instance of ConditionalSend or ConditionalReceive, depending on the communication in the branch. Please see these classes for details on guarded communication statements, which they represent. The identification number assigned to each branch only needs to identify the branch uniquely for one sequence of the steps above. A good example of how to use a CDO is the code in the actor CSPBuffer, in the ptolemy.domains.csp.lib package. One significant difference between a CDO (or CIF) and a common do (if) is that all the branches are evaluated in parallel, as opposed to sequentially.
The chooseBranch() method takes an array of the branches as an argument, and simply passes the branches to the chooseBranch() method of the controller to decide which branch is successful. The successful branch is the branch that succeeds with its communication. See the chooseBranch() method of ConditionalBranchController for details about how the successful branch is chosen.
Time is supported by the method delay(double). This delays the process until time has advanced the argument time from the current model time. If this method is called with a zero argument, then the process continues immediately. As far as each process is concerned, time can only increase while the process is blocked trying to rendezvous or when it is delayed. A process can be aware of the current model time, but it should only affect the model time through delays. Thus time is centralized in that it is advanced by the director controlling the process represented by this actor.
A process can also choose to delay its execution until the next occasion a deadlock occurs by calling _waitForDeadlock(). The process resumes at the same model time at which it delayed. This is useful if a process wishes to delay itself until some changes to the topology have been carried out.
The model of computation used in this domain extends the original CSP, as proposed by Hoare in 1978, model of computation in two ways. First it allows non-deterministic communication using both sends and receives. The original model only allowed non-deterministic receives. Second, a centralized notion of time has been added. The original proposal was untimed. Neither of these extensions are new, but it is worth noting the differences between the model used here and the original model. If an actor wishes to use either non-deterministic rendezvous or time, it must derive from this class. Otherwise deriving from AtomicActor is sufficient.
ConditionalBranch
,
ConditionalReceive
,
ConditionalSend
Yellow (liuj) |
Green (nsmyth) |
Entity.ContainedObjectsIterator
_typesValid
_actorFiringListeners, _initializables, _notifyingActorFiring, _stopRequested
_changeListeners, _changeLock, _changeRequests, _debugging, _debugListeners, _deferChangeRequests, _elementName, _isPersistent, _verbose, _workspace, ATTRIBUTES, CLASSNAME, COMPLETE, CONTENTS, DEEP, FULLNAME, LINKS
COMPLETED, NOT_READY, STOP_ITERATING
Constructor and Description |
---|
CSPActor()
Construct a CSPActor in the default workspace with an empty string
as its name.
|
CSPActor(CompositeEntity container,
java.lang.String name)
Construct a CSPActor in the specified container with the specified
name.
|
CSPActor(Workspace workspace)
Construct a CSPActor in the specified workspace with an empty
string as a name.
|
Modifier and Type | Method and Description |
---|---|
protected void |
_cancelDelay()
If the actor is delayed, then cancel the delay.
|
protected void |
_continue()
Resume a delayed actor.
|
protected void |
_waitForDeadlock()
Wait for deadlock to occur.
|
int |
chooseBranch(ConditionalBranch[] branches)
Determine which branch succeeds with a rendezvous.
|
java.lang.Object |
clone(Workspace workspace)
Clone this actor into the specified workspace.
|
void |
delay(double delta)
Delay this actor.
|
AbstractBranchController |
getBranchController()
Return the conditional branch control of this actor.
|
void |
initialize()
Initialize the state of the actor.
|
boolean |
postfire()
Return false.
|
void |
terminate()
Terminate abruptly any threads created by this actor.
|
_containedTypeConstraints, _customTypeConstraints, _defaultTypeConstraints, _fireAt, _fireAt, attributeTypeChanged, clone, isBackwardTypeInferenceEnabled, newPort, typeConstraintList, typeConstraints
_actorFiring, _actorFiring, _declareDelayDependency, addActorFiringListener, addInitializable, connectionsChanged, createReceivers, declareDelayDependency, fire, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, isFireFunctional, isStrict, iterate, newReceiver, outputPortList, prefire, preinitialize, pruneDependencies, recordFiring, removeActorFiringListener, removeDependency, removeInitializable, setContainer, stop, stopFire, wrapup
_adjustDeferrals, _checkContainer, _getContainedObject, _propagateExistence, getContainer, instantiate, isAtomic, isOpaque, moveDown, moveToFirst, moveToIndex, moveToLast, moveUp, propagateExistence, setName
_addPort, _description, _exportMoMLContents, _removePort, _validateSettables, connectedPortList, connectedPorts, containedObjectsIterator, getAttribute, getPort, getPorts, linkedRelationList, linkedRelations, portList, removeAllPorts, setClassDefinition, uniqueName
_setParent, exportMoML, getChildren, getElementName, getParent, getPrototypeList, isClassDefinition, isWithinClassDefinition
_addAttribute, _adjustOverride, _attachText, _cloneFixAttributeFields, _containedDecorators, _copyChangeRequestList, _debug, _debug, _debug, _debug, _debug, _executeChangeRequests, _getIndentPrefix, _isMoMLSuppressed, _markContentsDerived, _notifyHierarchyListenersAfterChange, _notifyHierarchyListenersBeforeChange, _propagateValue, _removeAttribute, _splitName, _stripNumericSuffix, addChangeListener, addDebugListener, addHierarchyListener, attributeChanged, attributeDeleted, attributeList, attributeList, decorators, deepContains, depthInHierarchy, description, description, event, executeChangeRequests, exportMoML, exportMoML, exportMoML, exportMoML, exportMoMLPlain, getAttribute, getAttributes, getChangeListeners, getClassName, getDecoratorAttribute, getDecoratorAttributes, getDerivedLevel, getDerivedList, getDisplayName, getFullName, getModelErrorHandler, getName, getName, getSource, handleModelError, isDeferringChangeRequests, isOverridden, isPersistent, lazyContainedObjectsIterator, message, notifyOfNameChange, propagateValue, propagateValues, removeAttribute, removeChangeListener, removeDebugListener, removeHierarchyListener, requestChange, setClassName, setDeferringChangeRequests, setDerivedLevel, setDisplayName, setModelErrorHandler, setPersistent, setSource, sortContainedObjects, toplevel, toString, validateSettables, workspace
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
createReceivers, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, newReceiver, outputPortList
fire, isFireFunctional, isStrict, iterate, prefire, stop, stopFire
addInitializable, preinitialize, removeInitializable, wrapup
description, getContainer, getDisplayName, getFullName, getName, getName, setName
getDerivedLevel, getDerivedList, propagateValue
public CSPActor()
public CSPActor(Workspace workspace)
workspace
- The workspace that will list the entity.public CSPActor(CompositeEntity container, java.lang.String name) throws IllegalActionException, NameDuplicationException
container
- The TypedCompositeActor that contains this actor.name
- The actor's name.IllegalActionException
- If the entity cannot be contained
by the proposed container.NameDuplicationException
- If the name argument coincides
with an entity already in the container.public int chooseBranch(ConditionalBranch[] branches) throws IllegalActionException
branches
- The set of conditional branches involved.IllegalActionException
- If the rendezvous fails
(e.g. because of incompatible types).public java.lang.Object clone(Workspace workspace) throws java.lang.CloneNotSupportedException
clone
in class TypedAtomicActor
workspace
- The workspace for the cloned object.java.lang.CloneNotSupportedException
- If cloned ports cannot have
as their container the cloned entity (this should not occur), or
if one of the attributes cannot be cloned.NamedObj.exportMoML(Writer, int, String)
,
NamedObj.setDeferringChangeRequests(boolean)
public void delay(double delta) throws IllegalActionException
delta
- The time to delay this actor for from the current
time.IllegalActionException
- If the argument is negative.TerminateProcessException
- If the director requests
termination by calling the protected method _cancelDelay().public AbstractBranchController getBranchController()
getBranchController
in interface BranchActor
public void initialize() throws IllegalActionException
initialize
in interface Initializable
initialize
in class AtomicActor<TypedIOPort>
IllegalActionException
- Not thrown in this base class,
but might be in a derived class.public boolean postfire() throws IllegalActionException
postfire
in interface Executable
postfire
in class AtomicActor<TypedIOPort>
IllegalActionException
- If thrown by the parent
class.public void terminate()
terminate
in interface Executable
terminate
in class AtomicActor<TypedIOPort>
protected void _cancelDelay()
protected void _continue()
protected void _waitForDeadlock()