Class PoisonableOne2OneChannelImpl<T>
- All Implemented Interfaces:
Serializable
,ChannelInternals<T>
,One2OneChannel<T>
Description
One2OneChannelImpl implements a one-to-one object channel. Multiple readers or multiple writers are not allowed -- these are catered for byAny2OneChannelImpl
,
One2AnyChannelImpl
or
Any2AnyChannelImpl
.
The reading process may ALT
on this channel.
The writing process is committed (i.e. it may not back off).
The default semantics of the channel is that of CSP -- i.e. it is zero-buffered and fully synchronised. The reading process must wait for a matching writer and vice-versa.
However, the static methods of Channel
allow the creation of
a channel with a plug-in driver conforming to the
ChannelDataStore
interface. This allows a variety of different channel semantics to be
introduced -- including buffered channels of user-defined capacity
(including infinite), overwriting channels (with various overwriting
policies) etc..
Standard examples are given in the org.jcsp.util package, but
careful users may write their own.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate Alternative
The Alternative class that controls the selectionprivate boolean
This flag indicates that the last transfer went OK.private boolean
The synchronisation flagprivate T
The (invisible-to-users) buffer used to store the data for the channelprivate int
Immunity is passed to the channel-ends, and is not used directly by the channel algorithmsprivate int
0 means unpoisonedprivate Object
The monitor synchronising reader and writer on this channelprivate boolean
Flag to deal with a spurious wakeup during a write -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
endRead()
in()
Returns theAltingChannelInput
to use for this channel.private boolean
out()
Returns theChannelOutput
object to use for this channel.read()
Reads an Object from the channel.boolean
turns off Alternative selection for the channel.boolean
readerEnable
(Alternative alt) turns on Alternative selection for the channel.boolean
Returns whether there is data pending on this channel.void
readerPoison
(int strength) void
Writes an Object to the channel.void
writerPoison
(int strength)
-
Field Details
-
rwMonitor
The monitor synchronising reader and writer on this channel -
hold
The (invisible-to-users) buffer used to store the data for the channel -
empty
private boolean emptyThe synchronisation flag -
done
private boolean doneThis flag indicates that the last transfer went OK. The purpose is to not throw a PoisonException to the writer side when the last transfer went OK, but the reader side injected poison before the writer side finished processing of the last write transfer. -
poisonStrength
private int poisonStrength0 means unpoisoned -
immunity
private int immunityImmunity is passed to the channel-ends, and is not used directly by the channel algorithms -
alt
The Alternative class that controls the selection -
spuriousWakeUp
private boolean spuriousWakeUpFlag to deal with a spurious wakeup during a write
-
-
Constructor Details
-
PoisonableOne2OneChannelImpl
PoisonableOne2OneChannelImpl(int _immunity)
-
-
Method Details
-
isPoisoned
private boolean isPoisoned() -
in
Returns theAltingChannelInput
to use for this channel. AsOne2OneChannelImpl
implementsAltingChannelInput
itself, this method simply returns a reference to the object that it is called on.- Specified by:
in
in interfaceOne2OneChannel<T>
- Returns:
- the
AltingChannelInput
object to use for this channel.
-
out
Returns theChannelOutput
object to use for this channel. AsOne2OneChannelImpl
implementsChannelOutput
itself, this method simply returns a reference to the object that it is called on.- Specified by:
out
in interfaceOne2OneChannel<T>
- Returns:
- the
ChannelOutput
object to use for this channel.
-
write
Writes an Object to the channel.- Specified by:
write
in interfaceChannelInternals<T>
- Parameters:
value
- the object to write to the channel.
-
read
Reads an Object from the channel.- Specified by:
read
in interfaceChannelInternals<T>
- Returns:
- the object read from the channel.
-
startRead
- Specified by:
startRead
in interfaceChannelInternals<T>
-
endRead
public void endRead()- Specified by:
endRead
in interfaceChannelInternals<T>
-
readerEnable
turns on Alternative selection for the channel. Returns true if the channel has data that can be read immediately.Note: this method should only be called by the Alternative class
- Specified by:
readerEnable
in interfaceChannelInternals<T>
- Parameters:
alt
- the Alternative class which will control the selection- Returns:
- true if the channel has data that can be read, else false
-
readerDisable
public boolean readerDisable()turns off Alternative selection for the channel. Returns true if the channel contained data that can be read.Note: this method should only be called by the Alternative class
- Specified by:
readerDisable
in interfaceChannelInternals<T>
- Returns:
- true if the channel has data that can be read, else false
-
readerPending
public boolean readerPending()Returns whether there is data pending on this channel.Note: if there is, it won't go away until you read it. But if there isn't, there may be some by the time you check the result of this method.
This method is provided for convenience. Its functionality can be provided by Pri Alting the channel against a SKIP guard, although at greater run-time and syntactic cost. For example, the following code fragment:
if (c.pending ()) { Object x = c.read (); ... do something with x } else ( ... do something else }
is equivalent to:if (c_pending.priSelect () == 0) { Object x = c.read (); ... do something with x } else ( ... do something else }
where earlier would have had to have been declared:final Alternative c_pending = new Alternative (new Guard[] {c, new Skip ()});
- Specified by:
readerPending
in interfaceChannelInternals<T>
- Returns:
- state of the channel.
-
writerPoison
public void writerPoison(int strength) - Specified by:
writerPoison
in interfaceChannelInternals<T>
-
readerPoison
public void readerPoison(int strength) - Specified by:
readerPoison
in interfaceChannelInternals<T>
-