Home | History | Annotate | Download | only in nonsfi
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <errno.h>
      6 #include <time.h>
      7 
      8 #include "components/nacl/loader/nonsfi/abi_conversion.h"
      9 #include "components/nacl/loader/nonsfi/irt_interfaces.h"
     10 #include "native_client/src/trusted/service_runtime/include/sys/time.h"
     11 
     12 namespace nacl {
     13 namespace nonsfi {
     14 namespace {
     15 
     16 bool NaClAbiClockIdToClockId(nacl_irt_clockid_t nacl_clk_id,
     17                              clockid_t* host_clk_id) {
     18   switch (nacl_clk_id) {
     19     case NACL_ABI_CLOCK_REALTIME:
     20       *host_clk_id = CLOCK_REALTIME;
     21       break;
     22     case NACL_ABI_CLOCK_MONOTONIC:
     23       *host_clk_id = CLOCK_MONOTONIC;
     24       break;
     25     case NACL_ABI_CLOCK_PROCESS_CPUTIME_ID:
     26       *host_clk_id = CLOCK_PROCESS_CPUTIME_ID;
     27       break;
     28     case NACL_ABI_CLOCK_THREAD_CPUTIME_ID:
     29       *host_clk_id = CLOCK_THREAD_CPUTIME_ID;
     30       break;
     31     default:
     32       // Unknown clock id.
     33       return false;
     34   }
     35   return true;
     36 }
     37 
     38 int IrtClockGetRes(nacl_irt_clockid_t clk_id, struct nacl_abi_timespec* res) {
     39   clockid_t host_clk_id;
     40   if (!NaClAbiClockIdToClockId(clk_id, &host_clk_id))
     41     return EINVAL;
     42 
     43   struct timespec host_res;
     44   if (clock_getres(host_clk_id, &host_res))
     45     return errno;
     46 
     47   // clock_getres() requires a NULL check but clock_gettime() doesn't.
     48   if (res)
     49     TimeSpecToNaClAbiTimeSpec(host_res, res);
     50   return 0;
     51 }
     52 
     53 int IrtClockGetTime(nacl_irt_clockid_t clk_id, struct nacl_abi_timespec* tp) {
     54   clockid_t host_clk_id;
     55   if (!NaClAbiClockIdToClockId(clk_id, &host_clk_id))
     56     return EINVAL;
     57 
     58   struct timespec host_tp;
     59   if (clock_gettime(host_clk_id, &host_tp))
     60     return errno;
     61 
     62   TimeSpecToNaClAbiTimeSpec(host_tp, tp);
     63   return 0;
     64 }
     65 
     66 }  // namespace
     67 
     68 // Cast away the distinction between host types and NaCl ABI types.
     69 const nacl_irt_clock kIrtClock = {
     70   reinterpret_cast<int(*)(nacl_irt_clockid_t, struct timespec*)>(
     71       IrtClockGetRes),
     72   reinterpret_cast<int(*)(nacl_irt_clockid_t, struct timespec*)>(
     73       IrtClockGetTime),
     74 };
     75 
     76 }  // namespace nonsfi
     77 }  // namespace nacl
     78