Package org.jcsp.lang

Class 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 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 methods of Channel allow the construction 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:
    Alternative, Any2OneChannelImpl, One2AnyChannelImpl, Any2AnyChannelImpl, ChannelDataStore
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private Alternative alt
      The Alternative class that controls the selection
      private boolean empty
      The synchronisation flag
      private T hold
      The (invisible-to-users) buffer used to store the data for the channel
      private java.lang.Object rwMonitor
      The monitor synchronising reader and writer on this channel
      private boolean spuriousWakeUp
      Flag to deal with a spurious wakeup during a write
    • 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
    • Constructor Detail

      • One2OneChannelImpl

        One2OneChannelImpl()
    • Method Detail

      • in

        public AltingChannelInput<T> 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<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 One2OneChannelImpl 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.
      • 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.
      • read

        public T read()
        Reads an Object from the channel.
        Specified by:
        read in interface ChannelInternals<T>
        Returns:
        the object read from 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.