int NaClNanosleep(struct nacl_abi_timespec const *req, struct nacl_abi_timespec *rem) { DWORD sleep_ms; uint64_t resolution; DWORD resolution_gap = 0; UNREFERENCED_PARAMETER(rem); /* round up from ns resolution to ms resolution */ sleep_ms = (req->tv_sec * NACL_MILLIS_PER_UNIT + NACL_UNIT_CONVERT_ROUND(req->tv_nsec, NACL_NANOS_PER_MILLI)); /* round up to minimum timer resolution */ resolution = NaClTimerResolutionNanoseconds(); NaClLog(4, "Resolution %"NACL_PRId64"\n", resolution); if (0 != resolution) { resolution = NACL_UNIT_CONVERT_ROUND(resolution, NACL_NANOS_PER_MILLI); resolution_gap = (DWORD) (sleep_ms % resolution); if (0 != resolution_gap) { resolution_gap = (DWORD) (resolution - resolution_gap); } } NaClLog(4, "Resolution gap %d\n", resolution_gap); sleep_ms += resolution_gap; NaClLog(4, "Sleep(%d)\n", sleep_ms); Sleep(sleep_ms); return 0; }
int NaClClockGetRes(nacl_clockid_t clk_id, struct nacl_abi_timespec *res) { int rv = -NACL_ABI_EINVAL; uint64_t t_resolution_ns; if (!g_NaClClock_is_initialized) { NaClLog(LOG_FATAL, "NaClClockGetRes invoked without successful NaClClockInit\n"); } switch (clk_id) { case NACL_CLOCK_REALTIME: case NACL_CLOCK_MONOTONIC: t_resolution_ns = NaClTimerResolutionNanoseconds(); res->tv_sec = (nacl_abi_time_t) (t_resolution_ns / NACL_NANOS_PER_UNIT); res->tv_nsec = (int32_t) (t_resolution_ns % NACL_NANOS_PER_UNIT); /* * very surprised if res->tv_sec != 0, since that would be a * rather low resolution timer! */ rv = 0; break; case NACL_CLOCK_PROCESS_CPUTIME_ID: case NACL_CLOCK_THREAD_CPUTIME_ID: break; } return rv; }