ftp.nice.ch/pub/next/unix/developer/pcn.2.0.s.tar.gz#/src/runtime/usc.c

This is usc.c in view mode; [Download] [Up]

/*
 * PCN Abstract Machine Emulator
 * Authors:     Arun Nanda    (07/17/91)
 *              Steve Tuecke  (Modifed for better integration with PCN)
 *
 * Please see the DISCLAIMER file in the top level directory of the
 * distribution regarding the provisions under which this software
 * is distributed.
 *
 * usc.c	-  Microsecond clock package.
 */

#include "pcn.h"

#ifdef UPSHOT

#include "usc.h"

usc_time_t _p_usc_MD_rollover_val = 0;

#ifdef encore
#   include <parallel.h>
#   define usc_MD_timer_size  (sizeof(unsigned)*8)
    unsigned *_p_usc_encore_timer;
#endif


#if defined(balance) || defined(symmetry)
#   define usc_MD_timer_size  (sizeof(usclk_t)*8)
#endif


#ifdef tc2000
#   define usc_MD_timer_size  (sizeof(unsigned long)*8)
#endif


#if defined(ipsc860) || defined(delta)
/* These are included from gauge.h *
#   if defined(delta)
#       include <mesh.h>
#   else
#       include <cube.h>
#   endif
*/
#   define usc_MD_timer_size ((sizeof(long)*8)+3)
#   define usc_MD_ticks_per_usec (HWHZ/1000000)
#endif


#ifdef PCN_USE_BSD_TIME
#   include <sys/time.h>
    usc_time_t _p_usc_MD_reference_time = 0;
#endif


/*
 * _p_usc_init()
 *
 * Initialize the usc timers
 */
void _p_usc_init()
{
#if defined(encore)
    _p_usc_encore_timer = timer_init();
    _p_usc_MD_rollover_val = (usc_time_t) ((1<<usc_MD_timer_size)-1);
#endif

#if defined(balance) || defined(symmetry)
    unsigned long roll;

    usclk_init();

    roll = 1 << (usc_MD_timer_size-1);
    _p_usc_MD_rollover_val = (usc_time_t) (roll + roll - 1);
#endif

#ifdef tc2000
    unsigned long roll;

    roll = 1 << (usc_MD_timer_size-1);
    _p_usc_MD_rollover_val = (usc_time_t) (roll + roll - 1);
#endif

#if defined(ipsc860) || defined(delta)
    esize_t hwtime;
    double ustime;
    
    hwtime.shigh = hwtime.slow = ~0x0;
    hwtime.shigh = (hwtime.shigh & 0x7) << (sizeof(long)*8-3);
    hwtime.slow = ((hwtime.slow >> 3) & ~(0x7 << (sizeof(long)*8-3)))
	| hwtime.shigh;
    ustime = (unsigned long)hwtime.slow * 0.8;
    _p_usc_MD_rollover_val = (usc_time_t) ustime; 
#endif

#ifdef PCN_USE_BSD_TIME
    struct timeval tp;
    struct timezone tzp;
    unsigned long roll;
    
    gettimeofday(&tp,&tzp);
    _p_usc_MD_reference_time = (usc_time_t) tp.tv_sec;
    
    roll = 1 << ((sizeof(usc_time_t)*8)-1);
    roll = roll + roll - 1;
    _p_usc_MD_rollover_val = (usc_time_t) (roll / 1000000);
#endif
} /* _p_usc_init() */


/*
 * _p_usc_MD_clock()
 *
 * Return the current clock value.
 */
usc_time_t _p_usc_MD_clock()
{
#ifdef tc2000
    struct {
	unsigned long hi;
	unsigned long low;
    } usclock;
    
    get64bitclock(&usclock);
    return((usc_time_t)usclock.low);
#endif

#if defined(ipsc860) || defined(delta)
    esize_t hwtime;
    double ustime;
    
    hwclock(&hwtime);
    hwtime.shigh = (hwtime.shigh & 0x7) << (sizeof(long)*8-3);
    hwtime.slow = ((hwtime.slow >> 3) & ~(0x7 << (sizeof(long)*8-3)))
	| hwtime.shigh;
    ustime = (unsigned long)hwtime.slow * 0.8;
    return((usc_time_t)ustime);
#endif

#ifdef PCN_USE_BSD_TIME
    unsigned long ustime;
    struct timeval tp;
    struct timezone tzp;
    
    gettimeofday(&tp,&tzp);
    ustime = (unsigned long) (tp.tv_sec - _p_usc_MD_reference_time);
    ustime = ustime % _p_usc_MD_rollover_val;
    ustime = (ustime * 1000000) + (unsigned long) tp.tv_usec;
    
    return((usc_time_t) ustime);
#endif
} /* _p_usc_MD_clock() */

#endif /* UPSHOT */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Marcel Waldvogel and Netfuture.ch.