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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
M@"\`+PI.N@3(4$]P`SE4``"\*<@8@+0`(3KH"M"1`U>R"9DJM``AM$C`L
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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