⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hires.xs

📁 source of perl for linux application,
💻 XS
📖 第 1 页 / 共 3 页
字号:
hrt_usleep(unsigned long usec){    struct timeval tv;    tv.tv_sec = 0;    tv.tv_usec = usec;    select(0, (Select_fd_set_t)NULL, (Select_fd_set_t)NULL,		(Select_fd_set_t)NULL, &tv);}#endif#endif /* #if !defined(HAS_USLEEP) && defined(HAS_SELECT) */#if !defined(HAS_USLEEP) && defined(WIN32)#define HAS_USLEEP#define usleep hrt_usleep  /* could conflict with ncurses for static build */voidhrt_usleep(unsigned long usec){    long msec;    msec = usec / 1000;    Sleep (msec);}#endif /* #if !defined(HAS_USLEEP) && defined(WIN32) */#if !defined(HAS_USLEEP) && defined(TIME_HIRES_NANOSLEEP)#define HAS_USLEEP#define usleep hrt_usleep  /* could conflict with ncurses for static build */voidhrt_usleep(unsigned long usec){	struct timespec ts1;	ts1.tv_sec  = usec * 1000; /* Ignoring wraparound. */	ts1.tv_nsec = 0;	nanosleep(&ts1, NULL);}#endif /* #if !defined(HAS_USLEEP) && defined(TIME_HIRES_NANOSLEEP) */#if !defined(HAS_USLEEP) && defined(HAS_POLL)#define HAS_USLEEP#define usleep hrt_usleep  /* could conflict with ncurses for static build */voidhrt_usleep(unsigned long usec){    int msec = usec / 1000;    poll(0, 0, msec);}#endif /* #if !defined(HAS_USLEEP) && defined(HAS_POLL) */#if defined(HAS_SETITIMER) && defined(ITIMER_REAL)inthrt_ualarm_itimer(int usec, int interval){   struct itimerval itv;   itv.it_value.tv_sec = usec / IV_1E6;   itv.it_value.tv_usec = usec % IV_1E6;   itv.it_interval.tv_sec = interval / IV_1E6;   itv.it_interval.tv_usec = interval % IV_1E6;   return setitimer(ITIMER_REAL, &itv, 0);}#ifdef HAS_UALARMinthrt_ualarm(int usec, int interval) /* for binary compat before 1.91 */{   return hrt_ualarm_itimer(usec, interval);}#endif /* #ifdef HAS_UALARM */#endif /* #if !defined(HAS_UALARM) && defined(HAS_SETITIMER) */#if !defined(HAS_UALARM) && defined(HAS_SETITIMER)#define HAS_UALARM#define ualarm hrt_ualarm_itimer  /* could conflict with ncurses for static build */#endif#if !defined(HAS_UALARM) && defined(VMS)#define HAS_UALARM#define ualarm vms_ualarm #include <lib$routines.h>#include <ssdef.h>#include <starlet.h>#include <descrip.h>#include <signal.h>#include <jpidef.h>#include <psldef.h>#define VMSERR(s)   (!((s)&1))static voidus_to_VMS(useconds_t mseconds, unsigned long v[]){    int iss;    unsigned long qq[2];    qq[0] = mseconds;    qq[1] = 0;    v[0] = v[1] = 0;    iss = lib$addx(qq,qq,qq);    if (VMSERR(iss)) lib$signal(iss);    iss = lib$subx(v,qq,v);    if (VMSERR(iss)) lib$signal(iss);    iss = lib$addx(qq,qq,qq);    if (VMSERR(iss)) lib$signal(iss);    iss = lib$subx(v,qq,v);    if (VMSERR(iss)) lib$signal(iss);    iss = lib$subx(v,qq,v);    if (VMSERR(iss)) lib$signal(iss);}static intVMS_to_us(unsigned long v[]){    int iss;    unsigned long div=10,quot, rem;    iss = lib$ediv(&div,v,&quot,&rem);    if (VMSERR(iss)) lib$signal(iss);    return quot;}typedef unsigned short word;typedef struct _ualarm {    int function;    int repeat;    unsigned long delay[2];    unsigned long interval[2];    unsigned long remain[2];} Alarm;static int alarm_ef;static Alarm *a0, alarm_base;#define UAL_NULL   0#define UAL_SET    1#define UAL_CLEAR  2#define UAL_ACTIVE 4static void ualarm_AST(Alarm *a);static int vms_ualarm(int mseconds, int interval){    Alarm *a, abase;    struct item_list3 {        word length;        word code;        void *bufaddr;        void *retlenaddr;    } ;    static struct item_list3 itmlst[2];    static int first = 1;    unsigned long asten;    int iss, enabled;    if (first) {        first = 0;        itmlst[0].code       = JPI$_ASTEN;        itmlst[0].length     = sizeof(asten);        itmlst[0].retlenaddr = NULL;        itmlst[1].code       = 0;        itmlst[1].length     = 0;        itmlst[1].bufaddr    = NULL;        itmlst[1].retlenaddr = NULL;        iss = lib$get_ef(&alarm_ef);        if (VMSERR(iss)) lib$signal(iss);        a0 = &alarm_base;        a0->function = UAL_NULL;    }    itmlst[0].bufaddr    = &asten;        iss = sys$getjpiw(0,0,0,itmlst,0,0,0);    if (VMSERR(iss)) lib$signal(iss);    if (!(asten&0x08)) return -1;    a = &abase;    if (mseconds) {        a->function = UAL_SET;    } else {        a->function = UAL_CLEAR;    }    us_to_VMS(mseconds, a->delay);    if (interval) {        us_to_VMS(interval, a->interval);        a->repeat = 1;    } else         a->repeat = 0;    iss = sys$clref(alarm_ef);    if (VMSERR(iss)) lib$signal(iss);    iss = sys$dclast(ualarm_AST,a,0);    if (VMSERR(iss)) lib$signal(iss);    iss = sys$waitfr(alarm_ef);    if (VMSERR(iss)) lib$signal(iss);    if (a->function == UAL_ACTIVE)         return VMS_to_us(a->remain);    else        return 0;}static voidualarm_AST(Alarm *a){    int iss;    unsigned long now[2];    iss = sys$gettim(now);    if (VMSERR(iss)) lib$signal(iss);    if (a->function == UAL_SET || a->function == UAL_CLEAR) {        if (a0->function == UAL_ACTIVE) {            iss = sys$cantim(a0,PSL$C_USER);            if (VMSERR(iss)) lib$signal(iss);            iss = lib$subx(a0->remain, now, a->remain);            if (VMSERR(iss)) lib$signal(iss);            if (a->remain[1] & 0x80000000)                 a->remain[0] = a->remain[1] = 0;        }        if (a->function == UAL_SET) {            a->function = a0->function;            a0->function = UAL_ACTIVE;            a0->repeat = a->repeat;            if (a0->repeat) {                a0->interval[0] = a->interval[0];                a0->interval[1] = a->interval[1];            }            a0->delay[0] = a->delay[0];            a0->delay[1] = a->delay[1];            iss = lib$subx(now, a0->delay, a0->remain);            if (VMSERR(iss)) lib$signal(iss);            iss = sys$setimr(0,a0->delay,ualarm_AST,a0);            if (VMSERR(iss)) lib$signal(iss);        } else {            a->function = a0->function;            a0->function = UAL_NULL;        }        iss = sys$setef(alarm_ef);        if (VMSERR(iss)) lib$signal(iss);    } else if (a->function == UAL_ACTIVE) {        if (a->repeat) {            iss = lib$subx(now, a->interval, a->remain);            if (VMSERR(iss)) lib$signal(iss);            iss = sys$setimr(0,a->interval,ualarm_AST,a);            if (VMSERR(iss)) lib$signal(iss);        } else {            a->function = UAL_NULL;        }        iss = sys$wake(0,0);        if (VMSERR(iss)) lib$signal(iss);        lib$signal(SS$_ASTFLT);    } else {        lib$signal(SS$_BADPARAM);    }}#endif /* #if !defined(HAS_UALARM) && defined(VMS) */#ifdef HAS_GETTIMEOFDAYstatic intmyU2time(pTHX_ UV *ret){  struct timeval Tp;  int status;  status = gettimeofday (&Tp, NULL);  ret[0] = Tp.tv_sec;  ret[1] = Tp.tv_usec;  return status;}static NVmyNVtime(){#ifdef WIN32  dTHX;#endif  struct timeval Tp;  int status;  status = gettimeofday (&Tp, NULL);  return status == 0 ? Tp.tv_sec + (Tp.tv_usec / NV_1E6) : -1.0;}#endif /* #ifdef HAS_GETTIMEOFDAY */static voidhrstatns(UV atime, UV mtime, UV ctime, UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec){  dTHXR;  *atime_nsec = 0;  *mtime_nsec = 0;  *ctime_nsec = 0;#ifdef TIME_HIRES_STAT#if TIME_HIRES_STAT == 1  *atime_nsec = PL_statcache.st_atimespec.tv_nsec;  *mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;  *ctime_nsec = PL_statcache.st_ctimespec.tv_nsec;#endif#if TIME_HIRES_STAT == 2  *atime_nsec = PL_statcache.st_atimensec;  *mtime_nsec = PL_statcache.st_mtimensec;  *ctime_nsec = PL_statcache.st_ctimensec;#endif#if TIME_HIRES_STAT == 3  *atime_nsec = PL_statcache.st_atime_n;  *mtime_nsec = PL_statcache.st_mtime_n;  *ctime_nsec = PL_statcache.st_ctime_n;#endif#if TIME_HIRES_STAT == 4  *atime_nsec = PL_statcache.st_atim.tv_nsec;  *mtime_nsec = PL_statcache.st_mtim.tv_nsec;  *ctime_nsec = PL_statcache.st_ctim.tv_nsec;#endif#if TIME_HIRES_STAT == 5  *atime_nsec = PL_statcache.st_uatime * 1000;  *mtime_nsec = PL_statcache.st_umtime * 1000;  *ctime_nsec = PL_statcache.st_uctime * 1000;#endif#endif}#include "const-c.inc"MODULE = Time::HiRes            PACKAGE = Time::HiResPROTOTYPES: ENABLEBOOT:{#ifdef MY_CXT_KEY  MY_CXT_INIT;#endif#ifdef ATLEASTFIVEOHOHFIVE#   ifdef HAS_GETTIMEOFDAY  {    hv_store(PL_modglobal, "Time::NVtime", 12, newSViv(PTR2IV(myNVtime)), 0);    hv_store(PL_modglobal, "Time::U2time", 12, newSViv(PTR2IV(myU2time)), 0);  }#   endif#endif}#if defined(USE_ITHREADS) && defined(MY_CXT_KEY)voidCLONE(...)    CODE:    MY_CXT_CLONE;#endifINCLUDE: const-xs.inc#if defined(HAS_USLEEP) && defined(HAS_GETTIMEOFDAY)NVusleep(useconds)        NV useconds	PREINIT:	struct timeval Ta, Tb;	CODE:	gettimeofday(&Ta, NULL);	if (items > 0) {	    if (useconds > 1E6) {		IV seconds = (IV) (useconds / 1E6);		/* If usleep() has been implemented using setitimer()		 * then this contortion is unnecessary-- but usleep()		 * may be implemented in some other way, so let's contort. */		if (seconds) {		    sleep(seconds);		    useconds -= 1E6 * seconds;		}	    } else if (useconds < 0.0)	        croak("Time::HiRes::usleep(%"NVgf"): negative time not invented yet", useconds);	    usleep((U32)useconds);	} else	    PerlProc_pause();	gettimeofday(&Tb, NULL);#if 0	printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec);#endif	RETVAL = 1E6*(Tb.tv_sec-Ta.tv_sec)+(NV)((IV)Tb.tv_usec-(IV)Ta.tv_usec);	OUTPUT:	RETVAL#if defined(TIME_HIRES_NANOSLEEP)NVnanosleep(nsec)        NV nsec	PREINIT:	struct timespec sleepfor, unslept;	CODE:	if (nsec < 0.0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -