🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.os.os2.programmer
1 messages
1 total messages Started by Jack Hudler Thu, 16 Aug 1990 22:08
Unix like alarm(2) simulator.
#1447
Author: Jack Hudler
Date: Thu, 16 Aug 1990 22:08
175 lines
5451 bytes
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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads