;/* port2.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 port2.c
Blink FROM LIB:c.o,port2.o TO port2 LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
** port2.c - port and message example, run at the same time as port1.c
*/
#include <exec/types.h>
#include <exec/ports.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <stdio.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL-C handling */
int chkabort(void) {return(0);}
#endif
BOOL SafePutToPort(struct Message *, STRPTR);
struct XYMessage {
struct Message xy_Msg;
WORD xy_X;
WORD xy_Y;
};
void main(int argc, char **argv)
{
struct MsgPort *xyreplyport;
struct XYMessage *xymsg, *reply;
/* Using CreatePort() with no name */
if (xyreplyport = CreatePort(0,0)) /* because this port need not be public. */
{
if (xymsg = (struct XYMessage *) AllocMem(sizeof(struct XYMessage), MEMF_PUBLIC | MEMF_CLEAR))
{
xymsg->xy_Msg.mn_Node.ln_Type = NT_MESSAGE; /* make up a message, */
xymsg->xy_Msg.mn_Length = sizeof(struct XYMessage); /* including the reply port. */
xymsg->xy_Msg.mn_ReplyPort = xyreplyport;
xymsg->xy_X = 10; /* our special message information. */
xymsg->xy_Y = 20;
printf("Sending to port1: x = %d y = %d\n", xymsg->xy_X, xymsg->xy_Y);
/* port2 will simply try to put */
if (SafePutToPort((struct Message *)xymsg, "xyport")) /* one message to port1 wait for */
{ /* the reply, and then exit */
WaitPort(xyreplyport);
if (reply = (struct XYMessage *)GetMsg(xyreplyport))
printf("Reply contains: x = %d y = %d\n", /* We don't ReplyMsg since */
xymsg->xy_X, xymsg->xy_Y); /* WE initiated the message. */
/* Since we only use this private port for receiving replies, and we sent */
/* only one and got one reply there is no need to cleanup. For a public port, */
/* or if you pass a pointer to the port to another process, it is a very good */
/* habit to always handle all messages at the port before you delete it. */
}
else printf("Can't find 'xyport'; start port1 in a separate shell\n");
FreeMem(xymsg, sizeof(struct XYMessage));
}
else printf("Couldn't get memory\n");
DeletePort(xyreplyport);
}
else printf("Couldn't create xyreplyport\n");
}
BOOL SafePutToPort(struct Message *message, STRPTR portname)
{
struct MsgPort *port;
Forbid();
port = FindPort(portname);
if (port) PutMsg(port, message);
Permit();
return(port ? TRUE : FALSE); /* FALSE if the port was not found */
/* Once we've done a Permit(), the port might go away and leave us with an invalid port */
} /* address. So we return just a BOOL to indicate whether the message has been sent or not. */
[Back to Amiga Developer Docs]