Package org.jcsp.lang

Class BufferedOne2OneChannel<T>

java.lang.Object
org.jcsp.lang.BufferedOne2OneChannel<T>
All Implemented Interfaces:
ChannelInternals<T>, One2OneChannel<T>

class BufferedOne2OneChannel<T> extends Object implements One2OneChannel<T>, ChannelInternals<T>
This implements a one-to-one object channel with user-definable buffering.

Description

BufferedOne2OneChannel implements a one-to-one object channel with user-definable buffering. Multiple readers or multiple writers are not allowed -- these are catered for by BufferedAny2OneChannel, BufferedOne2AnyChannel or BufferedAny2AnyChannel.

The reading process may ALT on this channel. The writing process is committed (i.e. it may not back off).

The constructor requires the user to provide the 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 Details

    • data

      private final ChannelDataStore<T> data
      The ChannelDataStore used to store the data for the channel
    • rwMonitor

      private final Object rwMonitor
    • alt

      private Alternative alt
  • Constructor Details

    • BufferedOne2OneChannel

      public BufferedOne2OneChannel(ChannelDataStore<T> data)
      Constructs a new BufferedOne2OneChannel with the specified ChannelDataStore.
      Parameters:
      data - the ChannelDataStore used to store the data for the channel
  • Method Details

    • read

      public T read()
      Reads an Object from the channel.
      Specified by:
      read in interface ChannelInternals<T>
      Returns:
      the object read from the channel.
    • startRead

      public T startRead()
      Specified by:
      startRead in interface ChannelInternals<T>
    • endRead

      public void endRead()
      Specified by:
      endRead in interface ChannelInternals<T>
    • write

      public void write(T value)
      Writes an Object to the channel.
      Specified by:
      write in interface ChannelInternals<T>
      Parameters:
      value - the object to write to the channel.
    • 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:
      readerEnable in interface ChannelInternals<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 interface ChannelInternals<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 interface ChannelInternals<T>
      Returns:
      state of the channel.
    • in

      public AltingChannelInput<T> in()
      Returns the AltingChannelInput to use for this channel. As BufferedOne2OneChannel implements AltingChannelInput itself, this method simply returns a reference to the object that it is called on.
      Specified by:
      in in interface One2OneChannel<T>
      Returns:
      the AltingChannelInput object to use for this channel.
    • out

      public ChannelOutput<T> out()
      Returns the ChannelOutput object to use for this channel. As BufferedOne2OneChannel implements ChannelOutput itself, this method simply returns a reference to the object that it is called on.
      Specified by:
      out in interface One2OneChannel<T>
      Returns:
      the ChannelOutput object to use for this channel.
    • writerPoison

      public void writerPoison(int strength)
      Specified by:
      writerPoison in interface ChannelInternals<T>
    • readerPoison

      public void readerPoison(int strength)
      Specified by:
      readerPoison in interface ChannelInternals<T>