📄 hires.xs
字号:
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,",&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 + -