home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
System
/
Sysmon
/
src
/
ExcptTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-08-02
|
3KB
|
88 lines
/*
** $RCSfile: ExcptTest.c,v $
** $Filename: ExcptTest.c $
** $Revision: 1.0 $
** $Date: 2000/08/01 15:25:03 $
**
** sysmon.library silly Exception Test program (version 1.0)
**
** (C) Copyright 2000 by Etienne Vogt
*/
#define __USE_SYSBASE
#include <proto/exec.h>
#include <proto/dos.h>
#include <string.h>
#include <stdlib.h>
#include "sysmon.h"
#include "sysmon_protos.h"
#include "sysmon_pragmas.h"
struct SysmonBase *SysmonBase;
/* Global variables shared with exception code */
struct Process *myproc;
volatile BOOL done = FALSE; /* Don't optimize this, please */
APTR oldexcept;
/* Prototypes */
int main(void);
static void cleanexit(int rc);
static ULONG __saveds __asm myexcept(register __d0 ULONG excptsigs, register __a1 APTR excptdata);
static UBYTE version[] = "$VER: ExcptTest 1.0 (2.8.2000)";
int main(void)
{
SysmonBase = NULL;
myproc = (struct Process *)FindTask(NULL);
if ((SysmonBase = (struct SysmonBase *)OpenLibrary("sysmon.library",1)) == NULL)
{ PutStr("ExcptTest: Couldn't open sysmon.library V1\n");
cleanexit(20);
}
smDisallowExcept(); /* Block exceptions for now */
oldexcept = myproc->pr_Task.tc_ExceptCode;
myproc->pr_Task.tc_ExceptCode = (APTR)myexcept; /* Set our exception code */
SetExcept(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F); /* Activate CTRL_C and CTRL_F as exception signals */
smAllowExcept(); /* Exceptions now allowed */
PutStr("Sleeping, Type CTRL_C or CTRL_F to quit\n");
while (!done) smHibernate(); /* Rrrrr... Pffffff.... */
PutStr("Woken up by CTRL_F, exiting\n");
smDisallowExcept(); /* Block exceptions again for cleanup */
SetExcept(0, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F); /* Deactivate exception signals */
myproc->pr_Task.tc_ExceptCode = oldexcept; /* Restore old exception code */
smAllowExcept();
cleanexit(0);
}
static ULONG __saveds __asm myexcept(register __d0 ULONG excptsigs, register __a1 APTR excptdata)
{
if (excptsigs & SIGBREAKF_CTRL_F) /* CTRL_F received */
{ done = TRUE; /* Tell the main code it's time to exit */
smWakeUp((struct Task*)myproc);
}
if (excptsigs & SIGBREAKF_CTRL_C) /* CTRL_C received */
{ PutStr("BREAK\n");
smEndExcept(FALSE); /* Prepare for exit, does an implicit smDisallowExcept() */
SetExcept(0, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F); /* Deactivate exception signals */
myproc->pr_Task.tc_ExceptCode = oldexcept; /* Restore old exception code */
smAllowExcept(); /* Don't forget this one */
cleanexit(5); /* byebye... */
}
return excptsigs; /* for compatibility with exec */
}
static void cleanexit(int rc)
{
if (SysmonBase) CloseLibrary((struct Library *)SysmonBase);
exit(rc);
}