A message is delivered to a given destination port with the PutMsg()
function. The message is queued to the port, and that port's arrival
action is invoked. If the action specifies a task signal or a software
interrupt, the originating task may temporarily lose the processor while
the destination processes the message. If a reply to the message is
required, the mn_ReplyPort field must be set up prior to the call to
PutMsg().
Here is a code fragment for putting a message to a public port. A
complete example is printed at the end of the chapter.
#Include <exec/types.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <libraries/dos.h>
VOID main(VOID);
BOOL SafePutToPort(struct Message *, STRPTR);
struct XYMessage {
struct Message xy_Msg;
UWORD xy_X;
UWORD xy_Y;
};
VOID main(VOID)
{
struct MsgPort *xyport, *xyreplyport;
struct XYMessage *xymsg, *msg;
BOOL foundport;
/* Allocate memory for the message we're going to send. */
if (xymsg = (struct XYMessage *) AllocMem(sizeof(struct XYMessage),
MEMF_PUBLIC | MEMF_CLEAR))
{
/* The replyport we'll use to get response */
if (xyreplyport = CreateMsgPort()) {
/* or use CreatePort(0,0) */
xymsg->xy_Msg.mn_Node.ln_Type = NT_MESSAGE;
/* Compose the message */
xymsg->xy_Msg.mn_Length = sizeof(struct XYMessage);
xymsg->xy_Msg.mn_ReplyPort = xyreplyport;
xymsg->xy_X = 10;
xymsg->xy_Y = 20;
/* Now try to send that message to a public port named
* "xyport". If foundport eq 0, the port isn't out there.
*/
if (foundport = SafePutToPort((struct Message *)xymsg,
"xyport"))
{
. . . /* Now let's wait till the someone responds... */
}
else printf("Couldn't find 'xyport'\n");
DeleteMsgPort(xyreplyport); /* Use DeletePort() if */
/* the port was created */
} /* with CreatePort(). */
else printf("Couldn't create message port\n");
FreeMem(xymsg, sizeof(struct XYMessage));
}
else printf("Couldn't get memory for xymessage\n");
}