home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
prgramer
/
sources
/
code.fra
< prev
next >
Wrap
Internet Message Format
|
1990-08-03
|
6KB
From: jack@cscdec.UUCP (Jack Hudler)
Subject: And alarm(1) for OS/2 1.2 (sources).
Date: 18 Jul 90 05:51:54 GMT
Organization: Computer Support Corporation. Dallas,Texas
Here is something I threw together one night while I was porting some code
from unix to OS/2.
There is no equivalent function in the C libraries for ALARM(1) so I wrote
this to simulate it. It does a very good job of it, infact if your porting code
you don't have to make any changes, just include alarm.h,compile and link it in.
If you compile with 'cl -DTESTING alarm.c' it will compile the small test code
in at the bottom, this allows you to test the code out.
Enjoy.
#] /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 Wed Jul 18 00:41:16 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\" \(3865 characters\)
sed "s/^X//" >alarm.c <<'END_OF_alarm.c'
X/*
X * This software is Copyright 1989 by Jack Hudler.
X *
X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
X * use this software as long as: there is no monetary profit gained
X * specifically from the use or reproduction or this software, it is not
X * sold, rented, traded or otherwise marketed, and this copyright notice is
X * included prominently in any copy made.
X *
X * The author make no claims as to the fitness or correctness of this software
X * for any use whatsoever, and it is provided as is. Any use of this software
X * is at the user's own risk.
X *
X */
X/****************************** Module Header ******************************\
X* Module Name: alarm.c
X* Created : 11-08-89
X* Author : Jack Hudler ╒jack@csccat.lonestar.org■
X* Copyright : 1988 Jack Hudler.
X* Function : Unix like alarm signal simulator.
X\***************************************************************************/
X/* Tested using OS2 1.2 with Microsoft C 5.1 and 6.0. */
X#define INCL_DOSPROCESS
X#define INCL_DOSSIGNALS
X#define INCL_DOS
X#include <os2.h>
X#include <stdio.h>
X#include <signal.h>
X
X#include "alarm.h"
X
X#define ALARM_STACK 4096 /* This maybe over kill, but the page size is 4K */
Xstatic PBYTE pbAlarmStack;
Xstatic SEL selAlarmStack;
Xstatic TID tidAlarm;
Xstatic PID pidMain;
Xstatic BOOL bAlarmInit=FALSE;
Xstatic BOOL bAlarmRunning=FALSE;
Xstatic ULONG ulTime;
XBOOL x;
X
XVOID FAR alarm_thread ( VOID )
X{
X while(1)
X {
X bAlarmInit = TRUE;
X if (bAlarmRunning)
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 contain 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 (bAlarmRunning)
X DosFlagProcess(pidMain,FLGP_PID, PFLG_A,1);
X bAlarmRunning=FALSE;
X }
X }
X else
X DosSleep(100L);
X }
X}
X
XVOID PASCAL FAR AlarmSignal(USHORT usSigArg,USHORT usSigNum)
X{
X /*
X * this is not executed from the thread. The thread triggers Process
X * flag A which is in the main processes scope, this inturn triggers
X * (via the raise) SIGUSR1 which is defined to SIGALRM.
X */
X raise(SIGUSR1);
X}
X
Xvoid alarm_init()
X{
X PFNSIGHANDLER pfnPrev;
X USHORT pfAction;
X PIDINFO pid;
X if (]DosAllocSeg( ALARM_STACK, (PSEL) &selAlarmStack, SEG_NONSHARED ))
X {
X OFFSETOF(pbAlarmStack) = ALARM_STACK - 2;
X SELECTOROF(pbAlarmStack) = selAlarmStack;
X /* Create the thread */
X if (DosCreateThread( alarm_thread, &tidAlarm, pbAlarmStack ))
X {
X fprintf(stderr,"Alarm thread failed to start.\n");
X exit(1);
X }
X /* Setup the signal handler for Process Flag A */
X if (DosSetSigHandler(AlarmSignal,&pfnPrev,&pfAction,SIGA_ACCEPT,SIG_PFLG_
X {
X fprintf(stderr,"SigHandler Failed to install.\n");
X exit(1);
X }
X /* Save main process ID, we'll need it for triggering the signal */
X DosGetPID(&pid);
X pidMain = pid.pid;
X }
X else
X exit(1);
X}
X
X
X
XULONG alarm(ULONG sec)
X{
X if (]bAlarmInit) alarm_init();
X if (sec)
X {
X ulTime = sec;
X bAlarmRunning = TRUE;
X }
X else
X bAlarmRunning = FALSE;
X
X}
X
X#ifdef TESTING
X/* A simple test to see if it works */
X`
Xtimeout()
X{
X fprintf(stderr,"ALARM TRIGGERED]]\n");
X DosBeep(1000,500);
X x++;
X}
X
Xmain()
X{
X (void) signal(SIGALRM, timeout);
X (void) alarm(1L);
X printf("ALARM RUNNING]]\n");
X while(]x);
X}
X#endif
END_OF_alarm.c
if test 3865 -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\" \(44 characters\)
sed "s/^X//" >alarm.h <<'END_OF_alarm.h'
X#define SIGALRM SIGUSR1
XULONG alarm(ULONG);
END_OF_alarm.h
if test 44 -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