ucb.util.mailbox
Class QueuedMailbox<Msg extends Serializable>

java.lang.Object
  extended by java.rmi.server.RemoteObject
      extended by java.rmi.server.RemoteServer
          extended by java.rmi.server.UnicastRemoteObject
              extended by ucb.util.mailbox.QueuedMailbox<Msg>
All Implemented Interfaces:
Serializable, Remote, Mailbox<Msg>
Direct Known Subclasses:
SinkBox

public class QueuedMailbox<Msg extends Serializable>
extends UnicastRemoteObject

A Mailbox with a specified (positive) capacity

See Also:
Serialized Form

Field Summary
protected  int capacity
           
protected  int depositBlocks
           
protected  boolean open
           
protected  LinkedList<Msg> queue
           
 
Fields inherited from class java.rmi.server.RemoteObject
ref
 
Constructor Summary
protected QueuedMailbox(Class<Msg> msgClass, int capacity)
          A new QueuedMailbox with given CAPACITY carrying messages of type MSGCLASS.
 
Method Summary
 int capacity()
          The capacity (see interface comment above) of THIS.
<T extends Serializable>
Mailbox<T>
checkType(Class<T> msgClass)
          Returns THIS, assuming that THIS conveys messages of class MSGCLASS.
 void close()
          Short for close (0).
 void close(long millis)
          Performs a flush(MILLIS) and then invalidates THIS for all future use, deleting all remaining messages.
static
<Msg extends Serializable>
QueuedMailbox<Msg>
create(Class<Msg> msgClass, int capacity)
          A new QueuedMailbox with capacity () fixed at CAPACITY.
static
<Msg extends Serializable>
QueuedMailbox<Msg>
create(int capacity)
          A new QueuedMailbox with capacity () fixed at CAPACITY, with no type checking.
 void deposit(Msg msg)
          Deposit MSG in this Mailbox.
 boolean deposit(Msg msg, long millis)
          Deposit MSG in this Mailbox, if this can be done within approximately MILLIS milliseconds.
protected  void enqueue(Msg msg)
          Place MSG at the end of the message queue.
 boolean flush(long millis)
          Wait for all queued messages to be received, or MILLIS milliseconds, whichever comes first.
protected  void forward(Msg msg, long millis)
          Perform forwarding of MSG to all recipients, waiting for up to MILLIS milliseconds for each deposit to be accepted.
 void forwardTo(List<Mailbox<Msg>> boxes)
          Forward copies of all messages (including any already present) to BOXES in the order received.
 void forwardTo(Mailbox<Msg> box)
          Forward copies of all messages (including any already present) to BOXES in the order received.
 boolean isClosed()
          True iff THIS is closed.
 boolean isForwarding()
          True iff THIS is currently forwarding messages as a result of forwardTo.
 Class<Msg> messageType()
          The (runtime) type of message sent through this box.
protected  long myWait(long limit)
          Wait for up to LIMIT milliseconds or the next notify or interrupt.
 Msg receive()
          Receive the next queued message in this Mailbox.
 Msg receive(long millis)
          Receive the next queued message in this Mailbox, if one is available within MILLIS milliseconds.
 void stopForwarding()
          Stop forwarding copies of messages.
 
Methods inherited from class java.rmi.server.UnicastRemoteObject
clone, exportObject, exportObject, exportObject, unexportObject
 
Methods inherited from class java.rmi.server.RemoteServer
getClientHost, getLog, setLog
 
Methods inherited from class java.rmi.server.RemoteObject
equals, getRef, hashCode, toString, toStub
 
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

queue

protected final LinkedList<Msg extends Serializable> queue

capacity

protected int capacity

open

protected boolean open

depositBlocks

protected int depositBlocks
Constructor Detail

QueuedMailbox

protected QueuedMailbox(Class<Msg> msgClass,
                        int capacity)
                 throws RemoteException
A new QueuedMailbox with given CAPACITY carrying messages of type MSGCLASS. The factory method create, rather than this constructor, is intended for public use.

Throws:
RemoteException
Method Detail

create

public static <Msg extends Serializable> QueuedMailbox<Msg> create(Class<Msg> msgClass,
                                                                   int capacity)
A new QueuedMailbox with capacity () fixed at CAPACITY.


create

public static <Msg extends Serializable> QueuedMailbox<Msg> create(int capacity)
A new QueuedMailbox with capacity () fixed at CAPACITY, with no type checking.


deposit

public void deposit(Msg msg)
             throws InterruptedException,
                    RemoteException
Deposit MSG in this Mailbox. If the Mailbox is full, wait if necessary for space to be available. MSG must be non-null. Throws Interrupted exception and does nothing if current thread is interrupted. Throws an IllegalStateException (or RemoteException) if THIS is closed. Throws IllegalArgumentException if MSG is null.

Throws:
InterruptedException
RemoteException

deposit

public boolean deposit(Msg msg,
                       long millis)
                throws InterruptedException,
                       RemoteException
Deposit MSG in this Mailbox, if this can be done within approximately MILLIS milliseconds. Returns true iff the message was deposited. Does not block if MILLIS is 0. MSG must be non-null. Throws Interrupted exception and does nothing if current thread is interrupted. Throws IllegalStateException (or RemoteException) if THIS is closed. Throws IllegalArgumentException if MSG is null.

Throws:
InterruptedException
RemoteException

receive

public Msg receive()
                                 throws InterruptedException
Receive the next queued message in this Mailbox. Returns null if THIS is closed. Throws Interrupted exception and does nothing if the current thread is interrupted.

Throws:
InterruptedException

receive

public Msg receive(long millis)
                                 throws InterruptedException
Receive the next queued message in this Mailbox, if one is available within MILLIS milliseconds. Returns null otherwise, including if THIS is closed. Does not block if MILLIS is 0. Throws Interrupted exception and does nothing if current thread is interrupted.

Throws:
InterruptedException

forwardTo

public void forwardTo(Mailbox<Msg> box)
               throws InterruptedException,
                      RemoteException
Forward copies of all messages (including any already present) to BOXES in the order received. Once forwarded to all destinations, messages are otherwise treated as usual. Deposit blocks until all forwarding is complete.

Throws:
InterruptedException
RemoteException

forwardTo

public void forwardTo(List<Mailbox<Msg>> boxes)
               throws InterruptedException,
                      RemoteException
Forward copies of all messages (including any already present) to BOXES in the order received. Once forwarded to all destinations, messages are otherwise treated as usual. Deposit blocks until all forwarding is complete.

Throws:
InterruptedException
RemoteException

stopForwarding

public void stopForwarding()
Stop forwarding copies of messages.


flush

public boolean flush(long millis)
              throws InterruptedException
Wait for all queued messages to be received, or MILLIS milliseconds, whichever comes first. During this wait, the Mailbox acts as if full from the point of view of all threads attempting to deposit. Returns true if all messages were flushed within the time limit.

Throws:
InterruptedException

close

public void close(long millis)
           throws InterruptedException
Performs a flush(MILLIS) and then invalidates THIS for all future use, deleting all remaining messages. Any waiting threads or subsequent calls receive an immediate InvalidStateException indicating an invalid state. In general, the thread that uses a Mailbox to send messages is the one that closes it.

Throws:
InterruptedException

close

public void close()
           throws InterruptedException
Short for close (0).

Throws:
InterruptedException

isForwarding

public boolean isForwarding()
True iff THIS is currently forwarding messages as a result of forwardTo.


isClosed

public boolean isClosed()
True iff THIS is closed.


capacity

public int capacity()
The capacity (see interface comment above) of THIS.


enqueue

protected void enqueue(Msg msg)
Place MSG at the end of the message queue.


forward

protected void forward(Msg msg,
                       long millis)
                throws RemoteException,
                       InterruptedException
Perform forwarding of MSG to all recipients, waiting for up to MILLIS milliseconds for each deposit to be accepted.

Throws:
RemoteException
InterruptedException

myWait

protected long myWait(long limit)
               throws InterruptedException
Wait for up to LIMIT milliseconds or the next notify or interrupt. Returns the remaining time.

Throws:
InterruptedException

messageType

public Class<Msg> messageType()
Description copied from interface: Mailbox
The (runtime) type of message sent through this box.

Specified by:
messageType in interface Mailbox<Msg extends Serializable>

checkType

public <T extends Serializable> Mailbox<T> checkType(Class<T> msgClass)
Description copied from interface: Mailbox
Returns THIS, assuming that THIS conveys messages of class MSGCLASS.

Specified by:
checkType in interface Mailbox<Msg extends Serializable>