Package org.jcsp.lang

Class One2OneChannelIntImpl

java.lang.Object
org.jcsp.lang.One2OneChannelIntImpl
All Implemented Interfaces:
ChannelInternalsInt, One2OneChannelInt

class One2OneChannelIntImpl extends Object implements ChannelInternalsInt, One2OneChannelInt
This implements a one-to-one integer channel.

Description

One2OneChannelIntImpl implements a one-to-one integer channel. Multiple readers or multiple writers are not allowed -- these are catered for by Any2OneChannelIntImpl, One2AnyChannelIntImpl or Any2AnyChannelIntImpl.

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 ChannelDataStoreInt 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.ints package, but careful users may write their own.

See Also:
  • Field Details

    • rwMonitor

      private Object rwMonitor
      The monitor synchronising reader and writer on this channel
    • hold

      private int 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
  • Constructor Details

    • One2OneChannelIntImpl

      One2OneChannelIntImpl()
  • Method Details

    • in

      public AltingChannelInputInt in()
      Returns the AltingChannelInputInt object to use for this channel. As One2OneChannelIntImpl implements AltingChannelInputInt itself, this method simply returns a reference to the object that it is called on.
      Specified by:
      in in interface One2OneChannelInt
      Returns:
      the AltingChannelInputInt object to use for this channel.
    • out

      public ChannelOutputInt out()
      Returns the ChannelOutputInt object to use for this channel. As One2OneChannelIntImpl implements ChannelOutputInt itself, this method simply returns a reference to the object that it is called on.
      Specified by:
      out in interface One2OneChannelInt
      Returns:
      the ChannelOutputInt object to use for this channel.
    • read

      public int read()
      Reads an int from the channel.
      Specified by:
      read in interface ChannelInternalsInt
      Returns:
      the integer read from the channel.
    • startRead

      public int startRead()
      Specified by:
      startRead in interface ChannelInternalsInt
    • endRead

      public void endRead()
      Specified by:
      endRead in interface ChannelInternalsInt
    • write

      public void write(int value)
      Writes an int to the channel.
      Specified by:
      write in interface ChannelInternalsInt
      Parameters:
      value - the integer 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 ChannelInternalsInt
      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 ChannelInternalsInt
      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 ()) {
           int x = c.read ();
           ...  do something with x
         } else (
           ...  do something else
         }
       
      is equivalent to:
         if (c_pending.priSelect () == 0) {
           int 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 ChannelInternalsInt
      Returns:
      state of the channel.
    • create

      public static One2OneChannelInt[] create(int n)
      Creates an array of One2OneChannelInts.
      Parameters:
      n - the number of channels to create in the array
      Returns:
      the array of One2OneChannelIntImpl
    • create

      public static One2OneChannelInt create(ChannelDataStoreInt store)
      Creates a One2OneChannelIntImpl using the specified ChannelDataStoreInt.
      Returns:
      the One2OneChannelIntImpl
    • create

      public static One2OneChannelInt[] create(int n, ChannelDataStoreInt store)
      Creates an array of One2OneChannelInts using the specified ChannelDataStoreInt.
      Parameters:
      n - the number of channels to create in the array
      Returns:
      the array of One2OneChannelIntImpl
    • readerPoison

      public void readerPoison(int strength)
      Specified by:
      readerPoison in interface ChannelInternalsInt
    • writerPoison

      public void writerPoison(int strength)
      Specified by:
      writerPoison in interface ChannelInternalsInt