Message ports are rendezvous points at which messages are collected. A
port may contain any number of outstanding messages from many different
originators. When a message arrives at a port, the message is appended to
the end of the list of messages for that port, and a prespecified arrival
action is invoked. This action may do nothing, or it may cause a
predefined task signal or software interrupt (see the "Exec Interrupts"
chapter).
Like many Exec structures, ports may be given a symbolic name. Such names
are particularly useful for tasks that must rendezvous with dynamically
created ports. They are also useful for debugging purposes.
A message port consists of a MsgPort structure as defined in the
<exec/ports.h> and <exec/ports.i> include files. The C structure for a
port is as follows:
struct MsgPort {
struct Node mp_Node;
UBYTE mp_Flags;
UBYTE mp_SigBit;
void *mp_SigTask;
struct List mp_MsgList;
};
mp_Node
is a standard Node structure. This is useful for tasks that might
want to rendezvous with a particular message port by name.
mp_Flags
are used to indicate message arrival actions. See the explanation
below.
mp_SigBit
is the signal bit number when a port is used with the task signal
arrival action.
mp_SigTask
is a pointer to the task to be signaled. If a software interrupt
arrival action is specified, this is a pointer to the interrupt
structure.
mp_MsgList
is the list header for all messages queued to this port. (See the
"Exec Lists and Queues" chapter).
The mp_Flags field contains a subfield indicated by the PF_ACTION mask.
This sub-field specifies the message arrival action that occurs when a
port receives a new message. The possibilities are as follows:
PA_SIGNAL
This flag tells Exec to signal the mp_SigTask using signal number
mp_SigBit on the arrival of a new message. Every time a message is
put to the port another signal will occur regardless of how many
messages have been queued to the port.
PA_SOFTINT
This flag tells Exec to Cause() a software interrupt when a message
arrives at the port. In this case, the mp_SigTask field must contain
a pointer to a struct Interrupt rather than a Task pointer. The
software interrupt will be Caused every time a message is received.
PA_IGNORE
This flag tells Exec to perform no operation other than queuing the
message. This action is often used to stop signaling or software
interrupts without disturbing the contents of the mp_SigTask field.
It is important to realize that a port's arrival action will occur for
each new message queued, and that there is not a one-to-one correspondence
between messages and signals. Task signals are only single-bit flags so
there is no record of how many times a particular signal occurred. There
may be many messages queued and only a single task signal; sometimes
however there may be a signal, but no messages. All of this has certain
implications when designing code that deals with these actions. Your code
should not depend on receiving a signal for every message at your port.
All of this is also true for software interrupts.
Creating a Message Port How To Rendezvous at a Message Port
Deleting a Message Port