Class One2OneChannelImpl<T>
- java.lang.Object
-
- org.jcsp.lang.One2OneChannelImpl<T>
-
- All Implemented Interfaces:
ChannelInternals<T>,One2OneChannel<T>
class One2OneChannelImpl<T> extends java.lang.Object implements One2OneChannel<T>, ChannelInternals<T>
This implements a one-to-one object channel.Description
One2OneChannelImpl implements a one-to-one object channel. Multiple readers or multiple writers are not allowed -- these are catered for byAny2OneChannelImpl,One2AnyChannelImplorAny2AnyChannelImpl.The reading process may
ALTon 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
Channelallow the construction of a channel with a plug-in driver conforming to theChannelDataStoreinterface. 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.
-
-
Field Summary
Fields Modifier and Type Field Description private AlternativealtThe Alternative class that controls the selectionprivate booleanemptyThe synchronisation flagprivate TholdThe (invisible-to-users) buffer used to store the data for the channelprivate java.lang.ObjectrwMonitorThe monitor synchronising reader and writer on this channelprivate booleanspuriousWakeUpFlag to deal with a spurious wakeup during a write
-
Constructor Summary
Constructors Constructor Description One2OneChannelImpl()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidendRead()AltingChannelInput<T>in()Returns theAltingChannelInputto use for this channel.ChannelOutput<T>out()Returns theChannelOutputobject to use for this channel.Tread()Reads an Object from the channel.booleanreaderDisable()turns off Alternative selection for the channel.booleanreaderEnable(Alternative alt)turns on Alternative selection for the channel.booleanreaderPending()Returns whether there is data pending on this channel.voidreaderPoison(int strength)TstartRead()voidwrite(T value)Writes an Object to the channel.voidwriterPoison(int strength)
-
-
-
Field Detail
-
rwMonitor
private java.lang.Object rwMonitor
The monitor synchronising reader and writer on this channel
-
hold
private T hold
The (invisible-to-users) buffer used to store the data for the channel
-
empty
private boolean empty
The synchronisation flag
-
alt
private Alternative alt
The Alternative class that controls the selection
-
spuriousWakeUp
private boolean spuriousWakeUp
Flag to deal with a spurious wakeup during a write
-
-
Method Detail
-
in
public AltingChannelInput<T> in()
Returns theAltingChannelInputto use for this channel. AsOne2OneChannelImplimplementsAltingChannelInputitself, this method simply returns a reference to the object that it is called on.- Specified by:
inin interfaceOne2OneChannel<T>- Returns:
- the
AltingChannelInputobject to use for this channel.
-
out
public ChannelOutput<T> out()
Returns theChannelOutputobject to use for this channel. AsOne2OneChannelImplimplementsChannelOutputitself, this method simply returns a reference to the object that it is called on.- Specified by:
outin interfaceOne2OneChannel<T>- Returns:
- the
ChannelOutputobject to use for this channel.
-
write
public void write(T value)
Writes an Object to the channel.- Specified by:
writein interfaceChannelInternals<T>- Parameters:
value- the object to write to the channel.
-
read
public T read()
Reads an Object from the channel.- Specified by:
readin interfaceChannelInternals<T>- Returns:
- the object read from the channel.
-
startRead
public T startRead()
- Specified by:
startReadin interfaceChannelInternals<T>
-
endRead
public void endRead()
- Specified by:
endReadin interfaceChannelInternals<T>
-
readerEnable
public boolean readerEnable(Alternative alt)
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:
readerEnablein 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:
readerDisablein 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:
readerPendingin interfaceChannelInternals<T>- Returns:
- state of the channel.
-
writerPoison
public void writerPoison(int strength)
- Specified by:
writerPoisonin interfaceChannelInternals<T>
-
readerPoison
public void readerPoison(int strength)
- Specified by:
readerPoisonin interfaceChannelInternals<T>
-
-