[comp.sys.amiga] IOEXAMPLE ... Example source/executable use of the timer.device

dillon@CORY.BERKELEY.EDU (Matt Dillon) (01/20/88)

	Here is a neat little example I put together which demonstrates how
simple it is to use the timer.device ...  It also provides a contrast to
other examples in that it uses GetMsg() and related calls to handle the IO
as well as specific IO calls like WaitIO() etc...

				-Matt


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	ioexample.c
#	ioexample.uue
# This archive created: Wed Jan 20 00:00:54 1988
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'ioexample.c'" '(5621 characters)'
if test -f 'ioexample.c'
then
	echo shar: "will not over-write existing file 'ioexample.c'"
else
cat << \!Funky!Stuff! > 'ioexample.c'

/*
 *  IOEXAMPLE.C
 *
 *  Example use of the timer device... using GetMsg() to handle returned
 *  IO requests.    AZTEC COMPILATION.	Should work with Lattice with
 *  slight modifications.  32 BIT INTEGERS!!!!!! (+L for Aztec).  I
 *  probably missed some #include's as well...
 *
 *  First "run ioexample on", then send timeout requests to the running
 *  program.. example "ioexample 2000" for a 2 second delay.  A public
 *  message port is used to communicate to the master.
 *
 *  ioexample off   or sending a CTRL-C (BREAK) to the master will turn
 *  it off.
 *
 *  run ioexample on
 *  ioexample 8000
 *  ioexample 2000
 *  ioexample 8000
 *  ioexample 3000
 *  ioexample 10000
 *
 *  (wait for the messages to display at the appropriate time)
 *
 *  ioexample off   (aborts any remaining requests and kills it)
 */

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/exec.h>
#include <devices/timer.h>

typedef struct MinList	MINLIST;
typedef struct MinNode	MINNODE;
typedef struct MsgPort	PORT;

typedef struct {
    struct IORequest	tr_node;    /*	standard timerequest	*/
    struct timeval	tr_time;    /*	standard timerequest	*/
    MINNODE		node;	    /*	for our own tracking	*/
} IOT;

extern APTR GetMsg();
extern APTR AllocMem();
extern APTR RemHead();
extern PORT *FindPort();
extern PORT *CreatePort();

#define NTOBASE(ptr)    (IOT *)((char *)ptr-(sizeof(IOT)-sizeof(MINNODE)))

extern int Enable_Abort;

main(ac,av)
char *av[];
{
    Enable_Abort = 0;			/*  disable break   */
    if (ac != 2) {
	puts("run ioexample on");
	puts("ioexample <timeout mS>");
	puts("ioexample off");
	av[1] = "off";
    }
    if (strcmp(av[1], "on") == 0) {     /*  run server      */
	if (do_on() == 0)
	    puts("Failed");
	exit(0);
    }
    if (strcmp(av[1], "off") == 0) {    /*  kill server     */
	PORT *port;
	Forbid();       /*  FindPort/Signal combo   */
	if (port = FindPort("IOEXAMPLE")) {
	    Signal(port->mp_SigTask, SIGBREAKF_CTRL_C);
	    puts("IOEXAMPLE Killed");
	} else {
	    puts("IOEXAMPLE not currently running");
	}
	Permit();
	exit(0);
    }

    /*
     *	Queue a timeout event to the server.  The server picks it up
     *	immediately.  The Forbid() is simply to ensure the server does
     *	not go away between finding the port and sending the message.
     *	The server will fill in the remaining fields of the request.
     */

    {
	long timeout = atoi(av[1]);
	IOT *iot = (IOT *)AllocMem(sizeof(IOT), MEMF_PUBLIC|MEMF_CLEAR);
	PORT *port = NULL;
	if (iot) {
	    Forbid();
	    iot->tr_time.tv_secs = timeout / 1000;
	    iot->tr_time.tv_micro= (timeout % 1000) * 1000;

	    if (port = FindPort("IOEXAMPLE"))
		PutMsg(port, iot);
	    else
		FreeMem(iot, sizeof(IOT));
	    Permit();
	}
	if (port == NULL)
	    puts("Unable to post message, IOEXAMPLE not running");
	exit(0);
    }
}

/*
 *  The SERVER!
 *
 *  -Accept new requests from the public port
 *  -SendIO() them to the timer device
 *  -Accept the BREAK command (BREAKF_CTRL_C) to exit
 */

do_on()
{
    register IOT *iot;
    IOT IOTimer;	/*  timer request template  */
    PORT *PubPort;	/*  the public port	    */
    PORT *IOPort;	/*  replies from the device */
    MINLIST LBase;
    long pub_mask, io_mask, mask;
    long reqnumber = 0;

    NewList(&LBase);
    IOPort = CreatePort(NULL, 0);           /*  Assume it works...  */
    PubPort= CreatePort("IOEXAMPLE", 0);

    /*
     *	The timer.device is easy... no initialization of the request
     *	is required before the OpenDevice().  Since the node in the
     *	io request itself is used by the device, and we need some way
     *	of aborting pending requests, I added another node to the
     *	structure and we use that to keep track of pending requests.
     */

    if (OpenDevice("timer.device", UNIT_MICROHZ, &IOTimer, 0) == 0) {
	pub_mask = 1 << PubPort->mp_SigBit;
	io_mask = 1 << IOPort->mp_SigBit;

	/*
	 *  Loops forever, until broken with a CTRL-C.
	 */

	for (;mask = Wait(pub_mask|io_mask|SIGBREAKF_CTRL_C);) {
	    if (mask & SIGBREAKF_CTRL_C) {
		/*
		 *  Abort pending requests.  Works even if the request
		 *  has come back since WaitIO() will remove it from
		 *  the reply port (PubPort).
		 */
		while (iot = (IOT *)RemHead(&LBase)) {
		    iot = NTOBASE(iot);         /*  the actual IOT  */
		    AbortIO(iot);               /*  Abort it        */
		    WaitIO(iot);                /*  Wait for it     */
		    printf("ABORTED: %ld\n", iot->tr_node.io_Message.mn_Node.ln_Name);
		    FreeMem(iot, sizeof(IOT));  /*  Free it         */
		}
		Forbid();                       /*  Remove the port */
		while (iot = (IOT *)GetMsg(PubPort))
		    FreeMem(iot, sizeof(IOT));
		DeletePort(PubPort);
		PubPort = NULL;
		Permit();
		break;
	    }
	    if (mask & io_mask) {
		while (iot = (IOT *)GetMsg(IOPort)) {
		    printf("Timeout #%ld\n", iot->tr_node.io_Message.mn_Node.ln_Name);
		    Remove(&iot->node);
		    FreeMem(iot, sizeof(IOT));
		}
	    }
	    if (mask & pub_mask) {
		while (iot = (IOT *)GetMsg(PubPort)) {
		    iot->tr_node.io_Device = IOTimer.tr_node.io_Device;
		    iot->tr_node.io_Unit = IOTimer.tr_node.io_Unit;
		    iot->tr_node.io_Command = TR_ADDREQUEST;
		    iot->tr_node.io_Message.mn_ReplyPort = IOPort;
		    iot->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
		    iot->tr_node.io_Message.mn_Node.ln_Name = (char *)reqnumber++;
		    AddTail(&LBase, &iot->node);
		    SendIO(iot);
		}
	    }
	}
	CloseDevice(&IOTimer);
    } else {
	puts("Unable to open timer.device");
    }
    if (IOPort)
	DeletePort(IOPort);
    if (PubPort)
	DeletePort(PubPort);
    puts("exiting");
    return(1);
}


!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'ioexample.uue'" '(9512 characters)'
if test -f 'ioexample.uue'
then
	echo shar: "will not over-write existing file 'ioexample.uue'"
else
cat << \!Funky!Stuff! > 'ioexample.uue'
begin 644 ioexample
M```#\P`````````#``````````(```8/````IP````$```/I```&#T[Z!0I.
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
M0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@````````````````
M``$``````0`````````````````````!`0````$`````````````````````
M`0(````!````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
L`````````````````````````````````!0``````_(```/K`````0```_(`
`
end
!Funky!Stuff!
fi  # end of overwriting check
exit 0
#	End of shell archive