org.jcsp.nxt.lang
Class One2OneChannelImpl

java.lang.Object
  extended by org.jcsp.nxt.lang.Guard
      extended by org.jcsp.nxt.lang.AltingChannelInput
          extended by org.jcsp.nxt.lang.One2OneChannelImpl
All Implemented Interfaces:
java.io.Serializable, ChannelInput, ChannelOutput, One2OneChannel

public class One2OneChannelImpl
extends AltingChannelInput
implements ChannelOutput, One2OneChannel, java.io.Serializable

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 by Any2OneChannelImpl, 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 create method allows the user to create 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.

Other static create methods allows the user to create fully initialised arrays of channels, including plug-ins if required.

Author:
P.D.Austin, P.H.Welch
See Also:
org.jcsp.lang.Alternative, org.jcsp.lang.Any2OneChannelImpl, org.jcsp.lang.One2AnyChannelImpl, org.jcsp.lang.Any2AnyChannelImpl, org.jcsp.util.ChannelDataStore, Serialized Form

Field Summary
protected  Alternative alt
          The Alternative class that controls the selection
protected  java.lang.Object rwMonitor
          The monitor synchronising reader and writer on this channel
 
Constructor Summary
One2OneChannelImpl()
           
 
Method Summary
(package private)  boolean disable()
          turns off Alternative selection for the channel.
(package private)  boolean enable(Alternative alt)
          turns on Alternative selection for the channel.
 AltingChannelInput in()
          Returns the AltingChannelInput to use for this channel.
 ChannelOutput out()
          Returns the ChannelOutput object to use for this channel.
 boolean pending()
          Returns whether there is data pending on this channel.
 java.lang.Object read()
          Reads an Object from the channel.
 void write(java.lang.Object value)
          Writes an Object to the channel.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

rwMonitor

protected java.lang.Object rwMonitor
The monitor synchronising reader and writer on this channel


alt

protected Alternative alt
The Alternative class that controls the selection

Constructor Detail

One2OneChannelImpl

public One2OneChannelImpl()
Method Detail

in

public AltingChannelInput in()
Returns the AltingChannelInput to use for this channel. As One2OneChannelImpl implements AltingChannelInput itself, this method simply returns a reference to the object that it is called on.

Specified by:
in in interface One2OneChannel
Returns:
the AltingChannelInput object to use for this channel.

out

public ChannelOutput out()
Returns the ChannelOutput object to use for this channel. As One2OneChannelImpl implements ChannelOutput itself, this method simply returns a reference to the object that it is called on.

Specified by:
out in interface One2OneChannel
Returns:
the ChannelOutput object to use for this channel.

write

public void write(java.lang.Object value)
Writes an Object to the channel.

Specified by:
write in interface ChannelOutput
Parameters:
value - the object to write to the channel.

read

public java.lang.Object read()
Reads an Object from the channel.

Specified by:
read in interface ChannelInput
Returns:
the object read from the channel.

enable

boolean enable(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:
enable in class Guard
Parameters:
alt - the Alternative class which will control the selection
Returns:
true if the channel has data that can be read, else false

disable

boolean disable()
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:
disable in class Guard
Returns:
true if the channel has data that can be read, else false

pending

public boolean pending()
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:
pending in class AltingChannelInput
Returns:
state of the channel.