[comp.unix.questions] Need help on finding sources for ualarm

srivasta@nazgul.ecs.umass.edu (Manoj Srivastava) (03/28/91)

Hello,

       I was   compiling a "third party software"  when I came across a
 reference to ualarm (int  arg),  and apparently,  from the context, it
 generates  a   signal (unix   SIGALARM)    after   arg   microseconds.
 unfortunately, my machine  has no such  beast, the closest it comes to
 is  alarm (unsigned arg),  which  takes an  arg    in seconds.  Is  it
 possible to get the sources of  any  such implementation, or  would it
 be too hardware dependent?  I am running ULTRIX v.4.1  on a DECstation
 5000/200  (MIPS  Architecture).  Any     advice/ pointers   shall   be
 appreciated.

	Thanks in advance.

		manoj srivastava
                Department of ece, umass amherst
 
ps. I'm directing follow ups to comp.unix.questions, as that may be
the most appropiate place for this. ms.

adrianho@barkley.berkeley.edu (Adrian J Ho) (03/28/91)

In article <1806@umvlsi.ecs.umass.edu> srivasta@nazgul.ecs.umass.edu (Manoj Srivastava) writes:

>  I was   compiling a "third party software"  when I came across a
> reference to ualarm (int  arg),  and apparently,  from the context, it
> generates  a   signal (unix   SIGALARM)    after   arg   microseconds.
> unfortunately, my machine  has no such  beast, the closest it comes to
> is  alarm (unsigned arg),  which  takes an  arg    in seconds.  Is  it
> possible to get the sources of  any  such implementation, or  would it
> be too hardware dependent?  I am running ULTRIX v.4.1  on a DECstation
> 5000/200  (MIPS  Architecture).  Any     advice/ pointers   shall   be
> appreciated.

Well, I'm running Ultrix 3.1 on a 3100, but that shouldn't make a
difference in what I'm about to say.

The SunOS 4.1 man page for ualarm(3) sez:

----------
UALARM(3)              C LIBRARY FUNCTIONS              UALARM(3)

NAME
     ualarm - schedule signal after interval in microseconds

SYNOPSIS
     unsigned ualarm(value, interval)
     unsigned value;
     unsigned interval;

DESCRIPTION
     This is a simplified interface to setitimer()  (see  getiti-
     mer(2)).

     ualarm() sends signal SIGALRM, see signal(3V), to the invok-
     ing  process  in a number of microseconds given by the value
     argument.  Unless caught or ignored, the  signal  terminates
     the process.

     <etc.>
---------

As you can see, ualarm() is just a wrapper for setitimer(2).  After
reading the latter man page, I came up with this (off the top of my
head):

==========
#include <sys/time.h>

unsigned ualarm(value, interval)
unsigend value;
unsigned interval;
{
    struct itimerval itv, oitv;

    /* Set values in itv */
    itv.it_interval.tv_sec = interval / 1000000;
    itv.it_interval.tv_usec = interval % 1000000;
    itv.it_value.tv_sec = value / 1000000;
    itv.it_value.tv_usec = value % 1000000;

    /* Call setitimer() */
    setitimer(ITIMER_REAL,&itv,&oitv)

    /* and return old value */
    return (oitv.it_value.tv_sec * 1000000 + oitv.it_value.tv_usec);
}
==========

Two things to note:

1) This code is untested.  I can't think of a reason why it wouldn't
work, but.....

2) You won't get microsecond resolution -- don't be fooled by the
tv_usec field.  From the Ultrix 3.1 getitimer(3) man page:

----------
     Time values smaller than the resolution of the system clock
     are rounded up to this resolution (on MIPS, 3.906 mil-
     liseconds; on VAX, 10 milliseconds).
----------

Other than that, good luck!

-----------------------------------------------------------------------------
Adrian Ho, EECS (pronounced "eeks!") Dept.		Phone: (415) 642-5563
UC Berkeley					adrianho@barkley.berkeley.edu
Domain: sesame-street (telly,bigbird,snuffy,oscar,kermit,bert,grover,barkley)