jack@cscdec.lonestar.org (Jack Hudler) (08/17/90)
I threw the together one day while porting some software from Unix to OS/2.
Enjoy!
Jack
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: alarm.c alarm.h
# Wrapped by jack@cscdec on Thu Aug 16 17:02:26 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f alarm.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"alarm.c\"
else
echo shar: Extracting \"alarm.c\" \(3127 characters\)
sed "s/^X//" >alarm.c <<'END_OF_alarm.c'
X/*
X * Alarm(2) simualtor for OS/2.
X *
X * This software is Copyright 1990 by Jack Hudler
X *
X * Permission is hereby granted to copy, reproduce, redistribute or
X * otherwise use this software as long as: there is no monetary
X * profit gained specifically from the use or reproduction or this
X * software, it is not sold, rented, traded or otherwise marketed, and
X * this copyright notice is included prominently in any copy
X * made.
X *
X * The author make no claims as to the fitness or correctness of
X * this software for any use whatsoever, and it is provided as is.
X * Any use of this software is at the user's own risk.
X *
X */
X#define INCL_DOSPROCESS
X#define INCL_DOSSIGNALS
X#define INCL_NOPM
X#include <os2.h>
X
X#define ALARM_STACK 4096 /* One page */
Xstatic PBYTE pbAlarmStack;
Xstatic SEL selAlarmStack;
Xstatic TID tidAlarm;
Xstatic PID pidMain;
Xstatic BOOL fAlarmInit=FALSE;
Xstatic BOOL fAlarmRunning=FALSE;
Xstatic ULONG ulTime;
X#ifdef TESTING
Xstatic BOOL fTriggered=FALSE;
X#endif
XVOID FAR alarm_thread ( VOID )
X{
X for(;;)
X {
X fAlarmInit = TRUE;
X if (fAlarmRunning)
X {
X DosSleep(1000L);
X ulTime--;
X if (ulTime==0L)
X {
X // send signal to the main process.. I could have put raise() here
X // however that would require the use of the multithreaded library,
X // and it does not support raise()!
X // I tried it with the standard library, this signaled ok, but a
X // test printf in the signal would not work and even caused SEGV.
X // So I signal the process through OS/2 and then the process
X // signals itself.
X if (fAlarmRunning)
X DosFlagProcess(pidMain,FLGP_PID, PFLG_A,1);
X fAlarmRunning=FALSE;
X }
X }
X else
X DosSleep(100L); /* sleep for only a 10th if doing nothing */
X }
X}
X
XVOID PASCAL FAR AlarmSignal(USHORT usSigArg,USHORT usSigNum)
X{
X raise(SIGUSR1);
X}
X
Xvoid alarm_init()
X{
X PFNSIGHANDLER pfnPrev;
X USHORT pfAction;
X PIDINFO pid;
X
X if (!DosAllocSeg( ALARM_STACK, (PSEL) &selAlarmStack, SEG_NONSHARED ))
X {
X OFFSETOF(pbAlarmStack) = ALARM_STACK - 2;
X SELECTOROF(pbAlarmStack) = selAlarmStack;
X if (DosCreateThread( alarm_thread, &tidAlarm, pbAlarmStack ))
X {
X fprintf(stderr,"Alarm thread failed to start.\n");
X exit(1);
X }
X if (DosSetSigHandler(AlarmSignal,&pfnPrev,&pfAction,
X SIGA_ACCEPT,SIG_PFLG_A))
X {
X fprintf(stderr,"SigHandler Failed to install.\n");
X exit(1);
X }
X DosGetPID(&pid);
X pidMain = pid.pid;
X fAlarmInit = TRUE;
X }
X else
X exit(1);
X}
X
X
X
XULONG alarm(ULONG sec)
X{
X if (!fAlarmInit) alarm_init();
X if (sec)
X {
X ulTime = sec;
X fAlarmRunning = TRUE;
X }
X else
X fAlarmRunning = FALSE;
X
X}
X
X#ifdef TESTING
Xtimeout()
X{
X fprintf(stderr,"ALARM TRIGGERED!!\n");
X DosBeep(1000,500);
X fTriggered++;
X}
X
Xmain()
X{
X (void) signal(SIGALRM, timeout);
X (void) alarm(1L);
X printf("ALARM RUNNING!!\n");
X while(!fTriggered);
X}
X#endif
END_OF_alarm.c
if test 3127 -ne `wc -c <alarm.c`; then
echo shar: \"alarm.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f alarm.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"alarm.h\"
else
echo shar: Extracting \"alarm.h\" \(89 characters\)
sed "s/^X//" >alarm.h <<'END_OF_alarm.h'
X#ifndef SIGUSR1
X#include <signal.h>
X#endif
X
X#define SIGALRM SIGUSR1
X
XULONG alarm(ULONG);
END_OF_alarm.h
if test 89 -ne `wc -c <alarm.h`; then
echo shar: \"alarm.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
--
Jack Computer Support Corporation Dallas,Texas
Hudler Internet: jack@cscdec.lonestar.org