xref: /llvm-project/libc/src/time/linux/timespec_get.cpp (revision e6cf5d2863b77895ae7183952514bedd9e8dde16)
1b8daa45aSPetr Hosek //===-- Implementation of timespec_get for Linux --------------------------===//
2b8daa45aSPetr Hosek //
3b8daa45aSPetr Hosek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b8daa45aSPetr Hosek // See https://llvm.org/LICENSE.txt for license information.
5b8daa45aSPetr Hosek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b8daa45aSPetr Hosek //
7b8daa45aSPetr Hosek //===----------------------------------------------------------------------===//
8b8daa45aSPetr Hosek 
9b8daa45aSPetr Hosek #include "src/time/timespec_get.h"
10b8daa45aSPetr Hosek #include "hdr/time_macros.h"
11b8daa45aSPetr Hosek #include "src/__support/common.h"
12b8daa45aSPetr Hosek #include "src/__support/macros/config.h"
13*e6cf5d28SSchrodinger ZHU Yifan #include "src/__support/time/clock_gettime.h"
14b8daa45aSPetr Hosek #include "src/errno/libc_errno.h"
15b8daa45aSPetr Hosek 
16b8daa45aSPetr Hosek namespace LIBC_NAMESPACE_DECL {
17b8daa45aSPetr Hosek 
18b8daa45aSPetr Hosek LLVM_LIBC_FUNCTION(int, timespec_get, (struct timespec * ts, int base)) {
19b8daa45aSPetr Hosek   clockid_t clockid;
20b8daa45aSPetr Hosek   switch (base) {
21b8daa45aSPetr Hosek   case TIME_UTC:
22b8daa45aSPetr Hosek     clockid = CLOCK_REALTIME;
23b8daa45aSPetr Hosek     break;
24b8daa45aSPetr Hosek   case TIME_MONOTONIC:
25b8daa45aSPetr Hosek     clockid = CLOCK_MONOTONIC;
26b8daa45aSPetr Hosek     break;
27b8daa45aSPetr Hosek   case TIME_ACTIVE:
28b8daa45aSPetr Hosek     clockid = CLOCK_PROCESS_CPUTIME_ID;
29b8daa45aSPetr Hosek     break;
30b8daa45aSPetr Hosek   case TIME_THREAD_ACTIVE:
31b8daa45aSPetr Hosek     clockid = CLOCK_THREAD_CPUTIME_ID;
32b8daa45aSPetr Hosek     break;
33b8daa45aSPetr Hosek   default:
34b8daa45aSPetr Hosek     return 0;
35b8daa45aSPetr Hosek   }
36b8daa45aSPetr Hosek 
37b8daa45aSPetr Hosek   auto result = internal::clock_gettime(clockid, ts);
38b8daa45aSPetr Hosek   if (!result.has_value()) {
39b8daa45aSPetr Hosek     libc_errno = result.error();
40b8daa45aSPetr Hosek     return 0;
41b8daa45aSPetr Hosek   }
42b8daa45aSPetr Hosek   return base;
43b8daa45aSPetr Hosek }
44b8daa45aSPetr Hosek 
45b8daa45aSPetr Hosek } // namespace LIBC_NAMESPACE_DECL
46