/**
* This package describes the Ibis Portability Layer (IPL), which is to be implemented by Ibis implementations.
* Ibis is a programming environment that combines Java's "run everywhere" portability both with flexible
* treatment of dynamically available networks and processor pools, and with highly efficient, object-based communication.
* <p>
* Communication is based on {@link ibis.ipl.ReceivePort ReceivePorts} and {@link ibis.ipl.SendPort SendPorts}
* of a certain port type, which is represented by a {@link ibis.ipl.PortType PortType}. Port capabilities
* are given to the port type (for example ports are "ONE_TO_ONE" and "RELIABLE" and support "OBJECT_SERIALIZATION").
* {@link ibis.ipl.ReceivePort ReceivePorts} and {@link ibis.ipl.SendPort SendPorts} both have a port type.
* Only receive ports and send ports of the same port type can communicate. Any number of receive ports and
* send ports can be created on a JVM (even of the same port type).
* <p>
* SendPorts and ReceivePorts are created by their Ibis instance using the
* {@link ibis.ipl.Ibis#createSendPort(PortType, String) createSendPort} and
* {@link ibis.ipl.Ibis#createReceivePort(PortType, String) createReceivePort} methods. When creating a
* ReceivePort, it can be supplied with an {@link ibis.ipl.MessageUpcall MessageUpcall} object. If so, upcalls
* are generated when messages arrive. If not, explicit receive must be used to read messages.
* <p>
* The system provides a globally unique {@link ibis.ipl.ReceivePortIdentifier ReceivePortIdentifier} and
* {@link ibis.ipl.SendPortIdentifier SendPortIdentifier} for every ReceivePort and SendPort. These identifiers
* are implementation specific and serializable (and can be sent over the network/saved in a file etc.).
* <p>
* A SendPort takes the initiative to connect to or disconnect from ReceivePorts (otherwise the one-way traffic
* scheme is violated). A SendPort can be connected to one or more ReceivePorts using their ReceivePortIdentifiers
* or their Ibis identifiers and names. Additional ReceivePorts may be connected at any time. A SendPort can be
* disconnected from one or more ReceivePorts using their ReceivePortIdentifiers. Additional ReceivePorts may be
* disconnected at any time. When a SendPort is no longer used it must be closed using the
* {@link ibis.ipl.SendPort#close() close} method. All connections the SendPort has are disconnected. When a
* ReceivePort is no longer used it must be closed using the {@link ibis.ipl.ReceivePort#close() close} method.
* This call will block until connections to SendPorts are disconnected (by the SendPorts).
* <p>
* A {@link ibis.ipl.WriteMessage message} can be sent from an SendPort to the set of ReceivePorts it is connected to.
* To do this, a {@link ibis.ipl.WriteMessage} write message is obtained from the SendPort (this allows streaming,
* as the destination is known). Data can be added to the message using "write" methods (this data may be immediately
* streamed to the ReceivePorts) of this message. The Ibis system may or may not asynchronously start sending the message.
* The message can be finished using the {@link ibis.ipl.WriteMessage#finish() finish} method. When the finish returns,
* all data has been copied (and now may be changed), and the message may no longer be used.
* <p>
* When a {@link ibis.ipl.ReadMessage message} arrives at a ReceivePort, how it is handled depends on the way the
* ReceivePort was instantiated. If messages are to be handled by means of upcalls, a "new" thread is started and the
* upcall is invoked with this message as parameter. When the message is no longer used it MAY be returned to the system
* using the {@link ibis.ipl.ReadMessage#finish() finish} method (after which the message may no longer be used).
* If messages are to be handled by means of explicit receive calls, a message is delivered when the
* {@link ibis.ipl.ReceivePort#receive() receive} method is called. When the message is no longer used it MUST be
* returned to the system using the {@link ibis.ipl.ReadMessage#finish() finish} method (after which the message may
* no longer be used). This allows the underlying implementation to deliver a next message.
*/
package ibis.ipl;