erts_time_t erts_get_time(void) { SysTimeval sys_tv; erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(&sys_tv); erts_smp_mtx_unlock(&erts_timeofday_mtx); return sys_tv.tv_sec; }
void erts_time_remaining(SysTimeval *rem_time) { int ticks; #if !defined(ERTS_TIMER_THREAD) SysTimeval cur_time; #endif long elapsed; /* next_time() returns no of ticks to next timeout or -1 if none */ if ((ticks = next_time()) == -1) { /* timer queue empty */ /* this will cause at most 100000000 ticks */ rem_time->tv_sec = 100000; rem_time->tv_usec = 0; } else { /* next timeout after ticks ticks */ ticks *= CLOCK_RESOLUTION; #if defined(ERTS_TIMER_THREAD) elapsed = 0; #else erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(&cur_time); cur_time.tv_usec = 1000 * (cur_time.tv_usec / 1000);/* ms resolution*/ elapsed = 1000 * (cur_time.tv_sec - last_delivered.tv_sec) + (cur_time.tv_usec - last_delivered.tv_usec) / 1000; erts_smp_mtx_unlock(&erts_timeofday_mtx); if (ticks <= elapsed) { /* Ooops, better hurry */ rem_time->tv_sec = rem_time->tv_usec = 0; return; } #endif rem_time->tv_sec = (ticks - elapsed) / 1000; rem_time->tv_usec = 1000 * ((ticks - elapsed) % 1000); } }
void wall_clock_elapsed_time_both(UWord *ms_total, UWord *ms_diff) { UWord prev_total; SysTimeval tv; erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(&tv); *ms_total = 1000 * (tv.tv_sec - inittv.tv_sec) + (tv.tv_usec - inittv.tv_usec) / 1000; prev_total = 1000 * (gtv.tv_sec - inittv.tv_sec) + (gtv.tv_usec - inittv.tv_usec) / 1000; *ms_diff = *ms_total - prev_total; gtv = tv; /* must sync the machine's idea of time here */ do_erts_deliver_time(&tv); erts_smp_mtx_unlock(&erts_timeofday_mtx); }
void erts_get_emu_time(SysTimeval *this_emu_time_p) { erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(this_emu_time_p); /* Make sure time is later than last */ if (last_emu_time.tv_sec > this_emu_time_p->tv_sec || (last_emu_time.tv_sec == this_emu_time_p->tv_sec && last_emu_time.tv_usec >= this_emu_time_p->tv_usec)) { *this_emu_time_p = last_emu_time; this_emu_time_p->tv_usec++; } /* Check for carry from above + general reasonability */ if (this_emu_time_p->tv_usec >= 1000000) { this_emu_time_p->tv_usec = 0; this_emu_time_p->tv_sec++; } last_emu_time = *this_emu_time_p; erts_smp_mtx_unlock(&erts_timeofday_mtx); }
void erts_time_remaining(SysTimeval *rem_time) { erts_time_t ticks; SysTimeval cur_time; erts_time_t elapsed; /* erts_next_time() returns no of ticks to next timeout or -1 if none */ ticks = (erts_time_t) erts_next_time(); if (ticks == (erts_time_t) -1) { /* timer queue empty */ /* this will cause at most 100000000 ticks */ rem_time->tv_sec = 100000; rem_time->tv_usec = 0; } else { /* next timeout after ticks ticks */ ticks *= CLOCK_RESOLUTION; erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(&cur_time); cur_time.tv_usec = 1000 * (cur_time.tv_usec / 1000);/* ms resolution*/ elapsed = 1000 * (cur_time.tv_sec - last_delivered.tv_sec) + (cur_time.tv_usec - last_delivered.tv_usec) / 1000; erts_smp_mtx_unlock(&erts_timeofday_mtx); if (ticks <= elapsed) { /* Ooops, better hurry */ rem_time->tv_sec = rem_time->tv_usec = 0; return; } rem_time->tv_sec = (ticks - elapsed) / 1000; rem_time->tv_usec = 1000 * ((ticks - elapsed) % 1000); } }
void erts_get_timeval(SysTimeval *tv) { erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(tv); erts_smp_mtx_unlock(&erts_timeofday_mtx); }